DjangoRestFramework HTTPS链接路由器和视图集

sah*_*chi 6 django ssl https django-rest-framework

是否有一种简单的方法可以修改视图集和路由器的开箱即用链接?

例如,在urls.py中:

from rest_framework import viewsets, routers
...
class Activity_TypeViewSet(viewsets.ModelViewSet):
    model = Activity_Type
...
router.register(r'activity_types', Activity_TypeViewSet)
...
url(r'^', include(router.urls)),
Run Code Online (Sandbox Code Playgroud)

这设置了url结构,如:

{"activity_types": "http://odd.quantdevgroup.com/activity_types/"}
Run Code Online (Sandbox Code Playgroud)

问题归结为链接的容易程度:

{"activity_types": "**https**://odd.quantdevgroup.com/activity_types/"}
Run Code Online (Sandbox Code Playgroud)

如果我取消激活http /端口80并且只允许https /端口443,那么我的应用程序需要在无法打开http后因手动将https添加到链接(因为我禁用了端口80).

alm*_*lki 25

DRF 反向用于request.build_absolute_uri(url)生成URL,这将使用此请求中可用的服务器变量"构建URL ".,因此,如果请求是http,则生成的URL将是HTTP,而HTTPS也是如此.

如果您的django应用程序在反向代理后面运行,那么您需要配置SECURE_PROXY_SSL_HEADER设置.

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
Run Code Online (Sandbox Code Playgroud)

但是,在设置时必须非常小心:

警告

如果您在不知道自己在做什么的情况下进行设置,则可能会在您的网站中打开安全漏洞.如果你没有按时设置它.认真.

在设置之前确保满足以下所有条件(假设上面示例中的值):

你的Django应用程序支持代理.您的代理会X-Forwarded-Proto从所有传入请求中删除 标头.换句话说,如果最终用户在其请求中包含该标头,则代理将丢弃该标头.您的代理设置X-Forwarded-Proto标头并将其发送到Django,但仅适用于最初通过HTTPS进入的请求.如果其中任何一个不正确,您应该将此设置设置为None 并找到另一种确定HTTPS的方法,可能通过自定义中间件.

对于nginx,您可以X-Forwarded-Proto使用以下配置设置标头:

location / {
    # ... 
    proxy_set_header X-Forwarded-Proto $scheme;
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经尝试了很多次了,但是还是没用 (2认同)