现在,如果我想检查当前页面是通过http://
还是https://
访问的,我会在我的模板中使用以下Javascript并从document.write
编写html:< / p>
<script type="text/javascript">
var protocol = document.location.protocol;
if (protocol == "http:")
document.write("regular");
else
document.write("secured");
</script>
有没有其他方法可以在不使用Javascript的情况下在Django模板中实现上述功能?
答案 0 :(得分:45)
如果您使用RequestContext
,则可以执行以下操作:
<p>You used: {% if request.is_secure %}HTTPS{% else %}HTTP{% endif %}
请参阅Django文档的relevant part。
答案 1 :(得分:22)
自Django 1.10起,您可以使用:
request.scheme
在视图中或在模板中:
{{ request.scheme }}
来自the docs
表示请求方案的字符串(通常为http或https)。
答案 2 :(得分:9)
您需要在setting.py文件中启用相应的请求上下文处理器:
TEMPLATE_CONTEXT_PROCESSORS = ('django.core.context_processors.request',)
模板现在将有一个名为request的变量,其中包含当前的HttpRequest。您可以使用它来查找协议:
{{ request.is_secure }}
答案 3 :(得分:2)
尝试在模板中使用RequestContext和request.is_secure
。
有一点需要注意,检测HTTPS的过程可能因服务器设置不同而不同,因此您可能需要做一些工作才能使request.is_secure
正常工作。您可以通过确保前端/反向代理设置“HTTP_X_FORWARDED_HOST”或编写自定义的中间件类来使其正常工作。
如果您使用自定义中间件路由,请使用depricated [1] SetRemoteAddrFromForwardedFor代码[2]作为起点。
(我每个帖子只允许1个链接,所以请原谅搞乱的链接)
[1]:docs.djangoproject.com/en/dev/releases/1.1/#id1“Django 1.1发行说明 - 删除了SetRemoteAddrFromForwardedFor middleware”
[2]:code.djangoproject.com/browser/django/trunk/django/middleware/http.py?rev=11000#L33“SetRemoteAddrFromForwardedFor”