Django @login_required 删除 https
Posted
技术标签:
【中文标题】Django @login_required 删除 https【英文标题】:Django @login_required dropping https 【发布时间】:2012-07-19 06:34:09 【问题描述】:我正在尝试使用 SSL 在本地测试我的 Django 应用程序。我对 @login_required
装饰器有看法。所以当我点击/locker
时,我会被重定向到/locker/login?next=/locker
。这适用于 http。
但是,每当我使用 https 时,重定向都会以某种方式断开安全连接,所以我会得到类似https://cumulus.dev/locker -> http://cumulus.dev/locker/login?next=/locker
如果我直接访问https://cumulus.dev/locker/login?next=locker
,该页面将通过安全连接正常打开。但是一旦我输入用户名和密码,我就会回到http://cumulus.dev/locker
。
我正在使用 nginx 来处理 SSL,然后它会与 runserver
对话。我的 nginx 配置是
upstream app_server_djangoapp
server localhost:8000 fail_timeout=0;
server
listen 80;
server_name cumulus.dev;
access_log /var/log/nginx/cumulus-dev-access.log;
error_log /var/log/nginx/cumulus-dev-error.log info;
keepalive_timeout 5;
# path for static files
root /home/gaurav/www/Cumulus/cumulus_lightbox/static;
location /
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename)
proxy_pass http://app_server_djangoapp;
break;
server
listen 443;
server_name cumulus.dev;
ssl on;
ssl_certificate /etc/ssl/cacert-cumulus.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
access_log /var/log/nginx/cumulus-dev-access.log;
error_log /var/log/nginx/cumulus-dev-error.log info;
keepalive_timeout 5;
# path for static files
root /home/gaurav/www/Cumulus/cumulus_lightbox/static;
location /
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename)
proxy_pass http://app_server_djangoapp;
break;
【问题讨论】:
我本来想说,“哦,只需更改LOGIN_URL
文件中的 LOGIN_URL
即可”......但我试过了,但它不起作用。好问题。
【参考方案1】:
Django 仅在代理后面在纯 HTTP 上运行,因此它将始终使用它来构造绝对 URL(例如重定向),除非您配置它如何查看代理请求最初是通过 HTTPS 发出的。
从 Django 1.4 开始,您可以使用 SECURE_PROXY_SSL_HEADER
设置来执行此操作。当 Django 看到配置的 header 时,它会将请求视为 HTTPS 而不是 HTTP:request.is_secure()
将返回 true,https://
将生成 URL,等等。
但是,请注意文档中的安全警告:您必须确保代理替换或去除所有传入客户端请求(HTTP 和 HTTPS)中的可信标头。您上面的 nginx 配置并没有对 X-Forwarded-Ssl
执行此操作,使其具有欺骗性。
对此的常规解决方案是在您的每个代理配置中酌情将X-Forwarded-Protocol
设置为http
或https
。然后,你可以配置 Django 来查找它:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
【讨论】:
谢谢! :) 我使用 Gunicorn 使它工作,但我记得设置了标题但不能使用标题设置,因为我还在 1.3 上! @GauravDadhania 你还记得你是怎么想出来的吗?我正在寻找答案***.com/questions/29737089/…以上是关于Django @login_required 删除 https的主要内容,如果未能解决你的问题,请参考以下文章
使用 @login_required 时的 Django 缓存
Django:使用@login_required 在视图上测试失败