在部署中打开图像的 URL 时页面返回“未找到”,但在本地机器上工作。

我的 Django REST API 应该能够获取和发布图像。在开发过程中,我能够将图像保存到数据库中,并通过图像的 URL 检索保存的图像。但是,当部署到 Heroku 时,当我单击图像的 URL 时,页面返回“未找到”。


要求.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(元素应用程序)


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(元素应用程序)


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')


注意:图像及其数据已保存,可以在管理面板中看到。但是,当打开图像的 URL 时,它返回“未找到”。


静态文件和媒体文件夹都被推送到 GitHub 存储库中


在我的本地机器上查看时,如果我打开 127.0.0.1:8000/media/elements/picture.png 的 URL,它会返回图像。部署后,当我打开 project_name.herokuapp.com/media/elements/picture.png 的 URL 时,它返回“未找到”


慕无忌1623718
浏览 105回答 1
1回答

浮云间

问题在于提供您的媒体文件。Django 不是为在生产中提供静态和媒体文件而构建的由于您使用 Heroku 作为托管平台,whitenoise因此能够处理您的静态文件。但是,对于媒体文件,解决该问题的一个简单方法是设置一个免费的 Amazon S3 帐户来托管您的所有媒体文件。这是一个快速参考指南在生产中提供 Django 媒体文件
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python