Django MEDIA недоступен
Мое приложение Django не может увидеть каталог MEDIA. Когда я запускаю одно из моих представлений, мне нужно открыть файл. Сценарий следующий:
- take a record with requested id from data base
- get the file path to a file
- 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. и из панели администратора. Запрашиваемый файл сохраняется правильно:
Также конфигурация 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 удается найти файл (как именно, я не знаю). Но файл изображения находится в вашем компьютере, и именно его вы хотите открыть.
