gpt4 book ai didi

django - 如何在Django身份验证生成的页面中启用https?

转载 作者:行者123 更新时间:2023-12-04 03:40:10 25 4
gpt4 key购买 nike

使用Django-auth应用程序(Django 1.3版),我想让我的登录页面转到https://mysite.com/login/。目前,我正在使用:

# urls.py
from django.contrib.auth.views import login
urlpatterns = patterns('', url(r'^login/$', login, name='login-view'),)

# navbar.html
<li id="nav-login"><a href="{% url login-view %}" ><b>Login</b></a></li>

效果很好,但转到 http://mysite.com/login/

当它反转 View 名称时,有什么方法可以告诉Django-auth使用什么前缀(https)?我已经阅读了整个手册页,但没有发现任何涵盖该手册页的内容。还是可以通过某种方式告诉 url标签转到https?

还是唯一手动指定整个URL的选项?我希望不要:)而且鉴于Django到目前为止的强大功能,我不敢相信它不会具有这种能力-我必须忽略它。 :)

最佳答案

将操作系统环境变量HTTPS设置为on

您需要将操作系统环境变量HTTPS启用为'on',以便django将https前缀为完全生成的链接(例如HttpRedirectRequest)。如果您使用的是mod_wsgi,则可以添加以下行:

os.environ['HTTPS'] = "on"

到你的 wsgi script。您可以通过阅读 django/http/__init__.py来了解此需求:
def build_absolute_uri(self, location=None):
"""
Builds an absolute URI from the location and the variables available in
this request. If no location is specified, the absolute URI is built on
``request.get_full_path()``.
"""
if not location:
location = self.get_full_path()
if not absolute_http_url_re.match(location):
current_uri = '%s://%s%s' % (self.is_secure() and 'https' or 'http',
self.get_host(), self.path)
location = urljoin(current_uri, location)
return iri_to_uri(location)

def is_secure(self):
return os.environ.get("HTTPS") == "on"

保护您的Cookie

settings.py中放行
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

和Cookie只会通过HTTPS连接发送。另外,您可能还需要 SESSION_EXPIRE_AT_BROWSER_CLOSE=True。请注意,如果您使用的是django的旧版本(低于1.4),则没有安全CSRF cookie的设置。作为快速解决方案,您可以通过编辑 SESSION_COOKIE_SECURE=True来确保 session cookie安全( django/middleware/csrf.py)时CSRF cookie的安全:
class CsrfViewMiddleware(object):
...
def process_response(self, request, response):
...
response.set_cookie(settings.CSRF_COOKIE_NAME,
request.META["CSRF_COOKIE"], max_age = 60 * 60 * 24 * 7 * 52,
domain=settings.CSRF_COOKIE_DOMAIN,
secure=settings.SESSION_COOKIE_SECURE or None)

将HTTP请求直接发送到Web服务器中的HTTPS

接下来,您需要一个重写规则,以将http请求重定向到https,例如在nginx中
server {
listen 80;
rewrite ^(.*) https://$host$1 permanent;
}

Django的 reverse函数和url模板标签仅返回相对链接;因此,如果您在https页面上,则您的链接将使您进入https网站。

关于django - 如何在Django身份验证生成的页面中启用https?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8015685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com