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 %}
Вернуться на верх