带有 ImageFIeld 和 HTTPS 的 Django ModelSerializer

Posted

技术标签:

【中文标题】带有 ImageFIeld 和 HTTPS 的 Django ModelSerializer【英文标题】:Django ModelSerializer with ImageFIeld and HTTPS 【发布时间】:2015-12-30 12:24:21 【问题描述】:

我有一个带有图像的模型新闻,这些新闻可以通过 JSON REST API 加载。服务器使用权威机构的证书进行签名,所有请求都必须使用 https 完成。

我的问题是,ModelSerializer 使用 http 而不是 https 序列化 ImageField。我该如何改变它?

这是代码和输出示例的摘要:

#myProject/models.py
class News(models.Model):
    image = models.ImageField()

#myProject/serializers.py
class NewsSerializer(serializers.ModelSerializer):
    class Meta:
        model = News
        fields = ('image')

#request for a news
https://myDomain/news/the-news-id-here/

#current output

    "image": "http://myDomain/media/news/imageName.jpg"


#wanted output

    "image": "https://myDomain/media/news/imageName.jpg"

谢谢 大卫

【问题讨论】:

在生成的响应中使用的方案是动态确定的,基于它自己的请求使用的方案。您是否通过 HTTPS 查询服务器?您还将在始终使用 HTTP 的开发服务器上获得不同的行为。还要检查您是否使用通过 HTTP 与 Django 通信的内部代理,在这种情况下,您需要设置 SECURE_PROXY_SSL_HEADER。 nginx中使用proxy_set_header X-Forwarded-Proto https; 【参考方案1】:

你可以在 nginx 配置中这样做,像这样

server 
    listen         80;
    return 301 https://$host$request_uri;

【讨论】:

【参考方案2】:

请考虑在您的 Nginx 虚拟主机文件中添加 proxy_set_header X-Forwarded-Proto https;,即位于 /etc/nginx/sites-available/ 中的 conf 文件。因此,简而言之,您的 conf 文件可能如下所示:

server 
    listen   443 ssl;
    server_name example.com www.example.com;
    root /var/www/html/static_files/;

    client_max_body_size 4G;
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto https;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    access_log /home/user/API/logs/nginx-access.log;
    error_log /home/user/API/logs/nginx-error.log;

    location /api/ 
        proxy_pass http://127.0.0.1:8000/api/;
    

    location /media/ 
        proxy_pass http://127.0.0.1:8000/media/;
    

    # Error pages
    # error_page 500 502 503 504 /home/user/API/500.html;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

总之,添加proxy_set_header X-Forwarded-Proto https;之后。您的 REST API 将被重定向到 https。感谢dukeboy 他的评论。

【讨论】:

仍然不起作用,即使使用标题。我正在使用 Django 1.11。编辑:您需要将 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 放入您的 Django 设置中 感谢您强调这一点

以上是关于带有 ImageFIeld 和 HTTPS 的 Django ModelSerializer的主要内容,如果未能解决你的问题,请参考以下文章

Django ORM 中 ImageField 的默认图像

Django Admin 显示来自 Imagefield 的图像

Django ImageField - 仅渲染元素

ImageField / FileField Django表单目前无法修剪文件名的路径

文件上传时的最大图像大小

DAY20-Django之FileField与ImageField