Страница возвращает «Не найдено» при открытии URL-адреса изображения в развертывании, но работает на локальном компьютере. [Django Rest Framework] - PullRequest
1 голос
/ 10 июля 2020

Мой Django REST API предположительно может получать изображения GET и POST. Во время разработки мне удалось сохранить изображение в базе данных и получить сохраненное изображение через URL-адрес изображения. Однако при развертывании в Heroku страница возвращает «Не найдено», когда я щелкнул URL-адрес изображения.

requirements.txt

asgiref==3.2.10
dj-database-url==0.5.0
Django==3.0.8
django-heroku==0.3.1
djangorestframework==3.11.0
gunicorn==20.0.4
Pillow==7.2.0
psycopg2==2.8.5
pytz==2020.1
sqlparse==0.3.1
whitenoise==5.1.0

settings.py

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'


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

django_heroku.settings(locals())

urls.py

from django.contrib import admin
from django.urls import path, include

from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('element.urls')),
]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

models.py (Element App)

from django.db import models

# Create your models here.
class Element(models.Model):
    element_name = models.CharField(max_length=255, unique=True)
    element_tag = models.CharField(max_length=255)
    element_type = models.CharField(max_length=255)
    element_img = models.ImageField(upload_to='elements/')
    creator_tag = models.CharField(max_length=255)
    creator_link = models.CharField(max_length=255)

    def __str__(self):
        return self.element_name

serializers.py (Element App)

from rest_framework import serializers
from element import models

class ElementSerializer(serializers.ModelSerializer):
    element_img = serializers.ImageField(max_length=None, use_url=True)

    class Meta:
        model = models.Element
        fields = ('id', 'element_name', 'element_tag', 'element_type', 'element_img', 'creator_tag', 'creator_link')

views.py (Приложение Element)

from django.shortcuts import render
from rest_framework import viewsets
from rest_framework import filters

from element import serializers
from element import models

# Create your views here.

class ElementViewSet(viewsets.ModelViewSet):
    queryset = models.Element.objects.all()
    serializer_class = serializers.ElementSerializer

    filter_backends = (filters.SearchFilter,)
    search_fields = ('element_name', 'element_tag', 'element_type',)

urls.py (Приложение Element)

from django.urls import path, include
from rest_framework.routers import DefaultRouter

from element import views

router = DefaultRouter()
router.register('elements', views.ElementViewSet, basename='Elements')

urlpatterns = [
    path('', include(router.urls))
]

Примечание: изображение вместе с его данными сохраняется и его можно увидеть в панели администратора. Однако при открытии URL-адреса изображения он возвращает «Не найдено».

Статические файлы и медиа-папка помещаются в репозиторий GitHub

При просмотре на моем локальном компьютере, если я открою URL-адрес 127.0.0.1:8000/media/elements/picture.png, он возвращает изображение. После развертывания, когда я открываю URL-адрес project_name.herokuapp.com/media/elements/picture.png, он возвращает «Not Found»

1 Ответ

1 голос
/ 10 июля 2020

Проблема заключается в обслуживании ваших медиафайлов.

Django не предназначен для обслуживания stati c и медиафайлов в производстве Развертывание Stati c Файлы

Поскольку вы используете Heroku в качестве хостинговой платформы, whitenoise может обрабатывать ваши stati c файлы. Однако для медиафайлов простое решение проблемы - создать бесплатную учетную запись Amazon S3 для размещения всех ваших медиафайлов.

Вот краткое справочное руководство Обслуживание Django Медиа-файлы в производстве

...