你能从Django的模板中查看网络协议吗?

时间:2009-12-03 18:17:50

标签: django django-templates

现在,如果我想检查当前页面是通过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模板中实现上述功能?

4 个答案:

答案 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”