django休息框架https为绝对网址?

jib*_*eel 6 python django django-rest-framework

托管api的服务器正在为绝对URL返回http,即使页面是使用https加载的,这是否与django rest框架有关?因为似乎没有任何明显的方法可以解决这个问题.

这是Meta类中的url字段是相关的

class NewsSerializer(serializers.HyperlinkedModelSerializer):
    user = UserSerializer(read_only=True)
    source = serializers.CharField(source='get_source_url', read_only=True)
    comments_count = serializers.IntegerField(read_only=True)
    date_added = serializers.CharField(source='humanize_date_added',
                                       read_only=True)
    is_owner = serializers.SerializerMethodField()
    user_voted = serializers.SerializerMethodField()
    favorited = serializers.SerializerMethodField()
    image = serializers.SerializerMethodField()    

    def create(self, validated_data):
        user = self.context['request'].user
        story = News(user=user, **validated_data)
        story.save()
        return story    

    def get_is_owner(self, obj):
        user = self.context['request'].user
        if user.is_active and user == obj.user:
            return True
        return False    

    def get_user_voted(self, obj):
        user = self.context['request'].user
        if user.is_active:
            return obj.user_voted(user)
        return None    

    def get_favorited(self, obj):
        user = self.context['request'].user
        if user.is_active:
            return obj.is_favorite(user)    


    class Meta:
        model = News
        fields = ('id', 'link', 'title', 'text', 'source', 'user',
                  'date_added', 'image', 'comments_count', 'url',
                  'upvotes', 'downvotes', 'user_voted', 'type',
                  'is_owner', 'favorited')
        read_only_fields = ('date_added')
Run Code Online (Sandbox Code Playgroud)

我不确定它是否与nginx有关,但我在配置中有这个

proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
Run Code Online (Sandbox Code Playgroud)

Lin*_*via 13

您需要确保nginx转发客户端的请求方案,因为它将向Django发出常规的http请求.您需要将以下行添加到vhost定义中:

proxy_set_header X-Forwarded-Proto $scheme;
Run Code Online (Sandbox Code Playgroud)

  • 同样不要忘记设置Django的SECURE_PROXY_SSL_HEADER来接受`X-Forwarded-Proto` https://docs.djangoproject.com/en/2.1/ref/settings/#secure-proxy-ssl-header (2认同)