heroku 在Django的get API中点击图片url时出现页面未找到错误

ltskdhd1  于 2023-05-18  发布在  Go
关注(0)|答案(2)|浏览(125)

我有一个简单的get API,使用Django Rest Framework构建。它从模型Menu中获取所有食物项目。它由一个图像场组成。API响应成功,我在image字段中获得了一个图像URL,但当我单击该URL时,该图像未显示在新选项卡中。我已经做了几个项目,据我所知,它应该显示在新的标签上的图像。由于这个原因,镜像不会在前端显示,在Reactjs中完成。后端暂时在Heroku中提供。
URL类似如下:
https://example.herokuapp.com/api/menus
本地的API响应如下:

当我同时点击image和image_url时,会显示以下内容:

我添加了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(在heroku上)上工作。
更新:

文件夹如下所示:

tyu7yeag

tyu7yeag1#

你需要做的改变是:
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之后的位置。有关FileFieldImageField的存储,请查看此处的文档。
在模型中使用FileField或ImageField(见下文)需要几个步骤:
1.)在你的设置文件中,你需要定义MEDIA_ROOT作为你希望Django存储上传文件的目录的完整路径。(为了提高性能,这些文件不存储在数据库中。)将MEDIA_URL定义为该目录的基本公共URL。确保Web服务器的用户帐户可以写入此目录。
2.)将FileField或ImageField添加到模型中,定义upload_to选项以指定用于上传文件的MEDIA_ROOT子目录。
3.)所有将存储在数据库中的是文件的路径(相对于MEDIA_ROOT)。你很可能想使用Django提供的方便url属性。例如,如果您的ImageField名为mug_shot,则可以使用{{ object.mug_shot.url }}在模板中获取图像的绝对路径。

xe55xuns

xe55xuns2#

要解决单击URL时不显示图像的问题,您需要进行一些更改:
在settings.py文件中,将MEDIA_ROOT设置更新为:
MEDIA_ROOT = os.path.join(BASE_DIR,'media/')在models.py文件中,将菜单模型中图像字段的upload_to参数更新为:
image = models.ImageField(upload_to ='pictures',null=True)通过设置upload_to参数为'pictures',Django会将上传的图片保存在相对于MEDIA_ROOT的media/pictures目录中。
完成这些更改后,图像应该可以通过URL访问,并在新选项卡中正确显示。
答案概述:提供的答案建议检查settings.py和models.py文件并进行更改。
第一个答案建议更新www.example.com文件中的MEDIA_ROOT设置settings.py,并更改Menus模型中图像字段的upload_to参数。MEDIA_ROOT应设置为os.path.join(BASE_DIR,'media/'),upload_to参数应设置为'pictures'。
答案还提到了在模型中使用FileField或ImageField的一般步骤,包括定义MEDIA_ROOT、指定upload_to选项以及使用模板中的url属性检索图像URL

相关问题