Ошибка страницы не найдена при нажатии на URL-адрес изображения, поступающий в API-интерфейс get в Django

avatar
Reactoo
9 августа 2021 в 06:38
131
1
0

У меня есть простой API для получения, созданный с использованием Django Rest Framework. Он получает все продукты питания из модели, Меню. Он состоит из поля изображения. Ответ API успешен, и я получаю URL-адрес изображения в поле изображения, но когда я нажимаю на этот URL-адрес, изображение не отображается на новой вкладке. Я сделал несколько проектов и, насколько я помню, он должен отображать изображение на новой вкладке. Из-за этого изображение не отображается во внешнем интерфейсе, что делается в Reactjs. Бэкенд пока обслуживается в Heroku.

URL выглядит следующим образом:

https://example.herokuapp.com/api/menus

Ответ API на локальном языке выглядит следующим образом:

enter image description here

И когда я нажимаю на изображение и на image_url, отображается следующее:

enter image description here

Я добавил image_url, чтобы посмотреть, работает ли он, но он тоже не сработал.

Моя модель:

class Menus(models.Model):
    category = models.CharField(max_length=50,choices=CATEGORY,default='main courses')
    food_name = models.CharField(max_length=100,blank=True, null=True)
    image = models.ImageField(upload_to='media/pictures',null=True)
    rating = models.FloatField(blank=True, null=True)
    description = RichTextField(blank=True, null=True)
    price = models.FloatField(blank=True, null=True)

Мои сериализаторы:

class MenusSerializer(serializers.ModelSerializer):
    image_url = serializers.SerializerMethodField('get_image_url')    

    def get_image_url(self, obj):
        request = self.context.get('request')
        image_url = obj.image.url
        return request.build_absolute_uri(image_url)



    class Meta:
        model = Menus
        fields = ['category','image', 'image_url','food_name',
                  'description','price','rating']

Мои настройки:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles/')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
django_heroku.settings(locals())

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media/pictures')

URL моего проекта:

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Примечание. Не работает как локально, так и в live API (на героку).

Обновление:

Папки выглядят следующим образом:

enter image description here

Источник
Shivendra Pratap Kushwaha
9 августа 2021 в 06:46
0

Вы проверили каталог изображения вручную. Я думаю, это не должно быть media/media/pictures, но должно быть media/pictures

Reactoo
9 августа 2021 в 07:03
0

хорошо, каким тогда должен быть мой media_url? пустой?? @ShivendraPratapKushwaha

Shivendra Pratap Kushwaha
9 августа 2021 в 08:11
0

нет... пожалуйста, проверьте вручную, куда загружено ваше изображение. также проверьте settings.DEBUG.

Reactoo
9 августа 2021 в 10:15
0

мой deub= true в settings.py....ваш код ниже тоже не работает.....

Shivendra Pratap Kushwaha
9 августа 2021 в 11:22
0

Вы проверили, где хранится ваш файл...??

Ответы (1)

avatar
Shivendra Pratap Kushwaha
9 августа 2021 в 08:26
0

Вам нужно внести следующие изменения:

settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media/')

models.py

class Menus(models.Model):
    ...
    image = models.ImageField(upload_to='pictures',null=True)
    ...

Настройка upload_to будет проверять местоположение после MEDIA_ROOT. Ознакомьтесь с документацией здесь для хранилища FileField или ImageField.

Использование FileField или ImageField (см. ниже) в модели занимает несколько шаги:

1.) В файле настроек вам необходимо определить MEDIA_ROOT как полный путь к каталогу, в котором вы хотите, чтобы Django хранил загруженные файлы. (Для повышения производительности эти файлы не сохраняются в базе данных.) Определите MEDIA_URL в качестве базового общедоступного URL-адреса этого каталога. Убедись, что этот каталог доступен для записи учетной записи пользователя веб-сервера.

2.) Добавьте FileField или ImageField в свою модель, определив опцию upload_to чтобы указать подкаталог MEDIA_ROOT для загрузки файлов.

3.) Все, что будет храниться в вашей базе данных, это путь к файлу (относительный в MEDIA_ROOT). Скорее всего, вы захотите использовать удобный URL атрибут, предоставленный Django. Например, если ваш ImageField называется mug_shot, вы можете получить абсолютный путь к вашему изображению в шаблон с {{ object.mug_shot.url }}.

Reactoo
10 августа 2021 в 05:32
0

Извините, @Shivendra, это не сработало ... Файлы находятся в папке с изображениями внутри папки мультимедиа.

Reactoo
10 августа 2021 в 05:33
0

Я загрузил изображение папки выше.

Shivendra Pratap Kushwaha
10 августа 2021 в 05:37
0

Вы также выполнили миграцию после изменения...?? и что вы получаете после этих изменений...?? сериализованный ответ...??

Reactoo
10 августа 2021 в 05:39
0

Нет никаких миграций для применения. Хорошо, может быть проблема с героку в медиафайлах, но почему это не происходит на локальном сервере, это моя главная путаница.

Shivendra Pratap Kushwaha
10 августа 2021 в 05:51
0

попробуйте удалить миграцию и запустить ее снова... Если вы получаете тот же ответ API, то упомянутые изменения не отражаются... эти изменения сделают ответ с media/media/pictures на media/pictures... и этот ответ будет соответствовать вашему каталогу файлов, как вы упомянули.

Reactoo
10 августа 2021 в 06:13
0

Нет, Шивендра, URL-адрес изменился на медиа/изображения только после того, как вы сделали то, что вы сказали, но все же, когда я нажимаю на URL-адрес изображения, он все еще показывает 404 не найдено.