首页 > 解决方案 > 如何获取django ListAPIView中文件的相对路径?

问题描述

想要从 API 返回的图像的相对路径:

想要为 API 返回“ /media/image.jpg”格式,而不是“ ”http://0.0.0.1:8000/media.image.jpg

对于以下内容,获取完整的 URL 即“ http://0.0.0.1:8000/media.image.jpg”格式

class ImageListAPIView(ListAPIView):
    serializer_class = QuestionImageSerializer
    queryset = QuestionImage.objects.all()

对于以下内容,获得正确的输出即:media/image.jpg格式,这是必需的

class ImageAPIView(APIView):
    def get(self, request, format=None):
        QuestionImages = QuestionImage.objects.all()
        SerializedData = QuestionImageSerializer(QuestionImages, many=True)
        return Response({
            'QeustionImages:': SerializedData.data
        })

如何返回 ListAPIView 的相对路径 URL?

尝试将以下内容放入序列化程序中,但无法将图像上传到 API。

 image = serializers.SerializerMethodField()
 def get_image(self, obj):
     return obj.image.url

PS:

模型.py:

class QuestionImage(models.Model):
    image = models.ImageField(upload_to=question_directory_path)

序列化程序.py:

class QuestionImageSerializer(ModelSerializer):
    class Meta:
        model = QuestionImage
        fields= [
            'id',
            'image',
        ]

标签: djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-rest-viewsets

解决方案


我假设您在生产中使用 gunicorn 或其他一些服务器,并将其放在 nginx 或 apache 后面。因此,为了从列表视图中获取正确的绝对 URL,您需要在 settings.py 中添加以下内容

USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

为了生成绝对 URL,django 从请求上下文中找到主机和端口。通过进行上述更改,您将指示 Django 对主机和端口使用 X-Forwarded-For 标头的值。

您需要确保您使用的 Nginx 或 Apache 应该将这些标头向前传递。对于 Nginx 和 Apache,您可以在此处找到说明https://www.nginx.com/resources/wiki/start/topics/examples/likeapache/


推荐阅读