Django не может загрузить изображения из моего медиафайла, но не выдает ошибку 404 и указывает правильный путь к файлу. Что может быть причиной этой проблемы?
Чтобы уточнить заголовок, у меня есть база данных, настроенная в моем Django-приложении, которая берет информацию из альбомов, включая обложки альбомов. Изображение сохраняется в базе данных, попадает в правильный MEDIA_ROOT, указанный в моем файле settings.py, и показывает правильный url путь при проверке пути запроса. Я использую последнюю версию Django и установил Pillow для добавления изображений в базу данных через админку сайта.
Раньше, когда путь к файлу был неверным, Django выдавал ошибку 404 и не мог найти файл. Теперь, когда путь правильный, он загружается на мгновение, а затем говорит "сервер не найден". Когда я просматриваю изображение, оно говорит, что "соединение, используемое для получения этого ресурса, было небезопасным". Однако я запускаю сервер локально и не нахожусь в производственной среде, и все ответы, связанные с этой проблемой, похоже, приходят от запуска сервера на производстве.
Когда я пытаюсь открыть изображение в новой вкладке, вкладка говорит "Сервер не найден" после попытки загрузить путь к файлу: "http://albums/filename_oja97pG.png" (вы можете увидеть здесь небезопасный http-ответ. Я заменил имя файла из соображений конфиденциальности.)
Я не знаю, что может вызвать эту проблему. Вот мой код:
models.py
class Album(models.Model):
title = models.CharField(
max_length=200,
validators=[MinLengthValidator(2, "Must be at least two characters.")]
)
release_date = models.DateField()
picture = models.ImageField(upload_to='albums/', blank=True)
content_type = models.CharField(max_length=256, blank=True, help_text='The MIMEType of the file')
description = models.TextField(blank=True)
def __str__(self):
return self.title
settings.py
BASE_DIR = Path(__file__).resolve().parent.parent
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')
urls.py
urlpatterns = [
path('', views.MusicView.as_view(), name='music'),
path('albums/<int:album_id>', views.AlbumView.as_view(), name='album_detail'),
]
projects urls.py
...
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
views.py
class AlbumView(DetailView):
model = Album
template_name = 'music/album_detail.html'
def get(self, request, album_id):
al = Album.objects.get(pk=album_id)
if al is not None:
context = {
'album' : al,
}
return render(request, self.template_name, context)
else:
raise Http404('Album does not exist.')
обслуживается шаблон html
{% extends 'base.html' %}
{% block welcome %}
{{ album.title }}
{% if album.content_type %}
<img src="/{{ BASE_DIR }}/{{ album.picture }}">
{% endif %}
{% endblock %}
Спасибо за помощь. Дайте мне знать, какую еще информацию я могу предоставить. Я попытался загрузить другие борвизоры и получил ту же проблему.
Вы можете попробовать использовать url непосредственно из поля ImageFile, так в вашем шаблоне:
{% extends 'base.html' %}
{% block welcome %}
{{ album.title }}
{% if album.content_type %}
<img src="{{ album.picture.url }}">
{% endif %}
{% endblock %}