Django MEDIA недоступен

Мое приложение Django не может увидеть каталог MEDIA. Когда я запускаю одно из моих представлений, мне нужно открыть файл. Сценарий следующий:

  1. take a record with requested id from data base
  2. get the file path to a file
  3. send the file to external server for OCR purposes

urls.py

from django.conf.urls.static import static


urlpatterns = [
    #my urls
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

models.py

from django.db import models
from django.contrib.auth.models import User

class Homework( models.Model):
    title = models.CharField(max_length = 200, default = None)
    image = models.FileField(upload_to='user_scans/')
    author = models.ForeignKey(User, default=None, on_delete = models.CASCADE)
    latex = models.TextField(default = "No LaTeX Here")

settings.py:

from pathlib import Path
from django.conf.urls.static import static

BASE_DIR = Path(__file__).resolve().parent.parent

...

DEBUG = True

...

STATIC_ROOT = BASE_DIR / 'static'
STATIC_URL = '/static/'
MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = "/media/"

views.py

import requests
import json
from django.shortcuts import render, get_object_or_404
from .models import Homework

def create_homework(request):
    if request.method == 'GET':
        #some GET stuff
    if request.method == 'POST':
        homework = Homework()
        homework.title = title
        homework.image = image
        homework.author = author
        homework.save()
        id = homework.id
        json_to_mathsnip(id)

        ....

def json_to_mathsnip(id):
    homework = get_object_or_404(Homework, pk=id)
    f = open(homework.image.url, "rb")

    ...
    some later stuff
    ...

К сожалению, я постоянно сталкиваюсь с ошибкой:

FileNotFoundError at /homework/new 

[Errno 2] No such file or directory: '/media/user_scans/kwa.png'

Моя главная проблема в том, что я могу получить доступ к файлу из localhost:8000/media/user_scans/kwa.png. и из панели администратора. Запрашиваемый файл сохраняется правильно:

file structure

Также конфигурация settings.py кажется нетронутой. В чем может быть проблема?

(env) $ pip freeze
asgiref==3.5.0
backports.zoneinfo==0.2.1
certifi==2021.10.8
charset-normalizer==2.0.12
Django==4.0.1
idna==3.3
Pillow==9.0.0
psycopg2-binary==2.9.3
requests==2.27.1
sqlparse==0.4.2
urllib3==1.26.9

Возможно, это не самый лучший способ, но я попробовал, и он работает. Суть в том, что при использовании функции open() с относительным путем, например /media/user_scans/kwa.png, файл должен находиться в том же каталоге, где вызывается функция. Вы можете просто найти абсолютный путь к файлам изображений на вашем компьютере, затем добавить к нему имя файла, и все будет работать, или вы можете сделать то, что я описал ниже.

import requests
import json
from django.shortcuts import render, get_object_or_404
from .models import Homework

# ADD THESE
import os
from pathlib import Path

def create_homework(request):
    if request.method == 'GET':
        #some GET stuff
    if request.method == 'POST':
        homework = Homework()
        homework.title = title
        homework.image = image
        homework.author = author
        homework.save()
        id = homework.id
        json_to_mathsnip(id)

        ....

def json_to_mathsnip(id):
    homework = get_object_or_404(Homework, pk=id)
    # ADD THESE
    BASE_DIR = Path(__file__).resolve().parent.parent
    path_to_image_file = str(BASE_DIR) + homework.image.url
    f = open(path_to_image_file, "rb")

    ...
    some later stuff
    ...

Когда вы показываете изображение в Django или обращаетесь к его url, это относительный путь, но корнем является корень url, localhost:8000/, а url изображения добавляется к нему, и Django удается найти файл (как именно, я не знаю). Но файл изображения находится в вашем компьютере, и именно его вы хотите открыть.

Вернуться на верх