django - 如何获取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',
]
解决方案
我假设您在生产中使用 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/
推荐阅读
- ios - 每次我添加代码以关闭键盘时,我的应用程序都会崩溃 - Swift
- python - django 表单不会进入帖子内部
- reactjs - 将数据子传递给reactjs中的父功能组件
- aws-lambda - 错误:请求失败,状态码为 403 (GET)
- python - 使用 'pd.read_sql_query' 查询索引会导致“OperationalError: (sqlite3.OperationalError) near "index": syntax error”
- redux-toolkit - 如何通过正确的错误处理在 Redux-Toolkit 中发出连续请求
- python - 将字符串转换为http字符串格式
- html - 将鼠标悬停在其父元素上时,如何将 3 个元素缩放到不同的大小?
- c++ - 将数据输入 Arduino 上的 uint8_t 数组 (C/C++)
- python - 错误:无法从 /usr/local/opt/pygtk/.brew/pygtk.rb 获取运行时依赖项