如何在Django ListAPIView中获取文件的相对路径?

时间:2019-02-16 16:23:23

标签: django django-models django-rest-framework django-views django-rest-viewsets

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

需要“ /media/image.jpg”格式,要返回API的“ 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:

models.py:

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

serializers.py:

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

1 个答案:

答案 0 :(得分:0)

我假设您在生产中使用gunicorn或其他服务器,并将其放在nginx或apache之后。因此,为了从列表视图中获取正确的绝对网址,您需要在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/

中找到说明。