你能从 Django 的模板中检查互联网协议吗?

Posted

技术标签:

【中文标题】你能从 Django 的模板中检查互联网协议吗?【英文标题】:Can you check the internet protocol from Django's template? 【发布时间】:2010-12-22 22:42:00 【问题描述】:

现在,如果我想检查当前页面是通过http://还是https://访问的,我将在我的模板中使用以下javascript并从document.write编写html

<script type="text/javascript">
var protocol = document.location.protocol;
if (protocol == "http:")
    document.write("regular");
else
    document.write("secured");
</script>

有没有另一种方法可以在不使用 Javascript 的情况下在 Django 的模板中实现上述功能?

【问题讨论】:

如果您只是想避免在 django 生成的页面中混合 http/https 内容,您可能会考虑使用协议相对 URL,例如 src="//ajax.googleapis.com/ajax/libs/ jquery/1.8.2/jquery.min.js”。 【参考方案1】:

如果您使用RequestContext,您可以执行以下操作:

<p>You used: % if request.is_secure %HTTPS% else %HTTP% endif %

请参阅 Django 文档的relevant part。

【讨论】:

您应该能够使用:HTTP% if request.is_secure %S% endif %:// request.get_host 作为获取完整基本 URL 的较短选项. 如果你想让base URL匹配你当前的协议,你不应该尝试手动切换,而只需使用//host.com/path这将在当前连接安全时通过https连接,在当前连接安全时通过http连接不是。【参考方案2】:

从 Django 1.10 开始,您可以使用:

request.scheme

在视图或模板中:

 request.scheme 

来自the docs

表示请求方案的字符串(通常为 http 或 https)。

【讨论】:

嗨,斯拉夫甘;请记住,您正在回答一个老问题,因此原始问题的作者可能很久以前就以一种或另一种方式解决了他们的问题。为了使您的答案有用,对于在网站上搜索类似问题的解决方案的其他读者来说,这应该是一个很好的答案;所以我建议添加更多的解释和细节,也许还有官方文档的链接,以真正证明为什么这种技术是解决这类问题的最佳方法。【参考方案3】:

您需要在您的 setting.py 文件中启用适当的请求上下文处理器:

TEMPLATE_CONTEXT_PROCESSORS = ('django.core.context_processors.request',)

模板现在将有一个名为 request 的变量,其中包含当前的 HttpRequest。您可以使用它来查找协议:

 request.is_secure 

【讨论】:

【参考方案4】:

尝试在您的模板中使用RequestContextrequest.is_secure

需要注意的是,检测 HTTPS 的过程可能因服务器设置不同而有所不同,因此您可能需要做一些工作才能使 request.is_secure 正常工作。您可以通过确保前端/反向代理设置“HTTP_X_FORWARDED_HOST”或编写自定义设置的中间件类来使其正常工作。

如果您采用自定义中间件路线,请使用 deprecated SetRemoteAddrFromForwardedFor code 作为起点。

【讨论】:

以上是关于你能从 Django 的模板中检查互联网协议吗?的主要内容,如果未能解决你的问题,请参考以下文章

你能用其他变量访问 django 模板语言中的变量属性吗?

discord.py 你能从 discord 标签中获取用户对象吗?

Android 你能从链接的 startActivityForResult 中获取活动结果吗

你能从 OTM ROM 中提取 blob 吗?

你能从 .jks 文件中提取 SHA1 吗?

iPhone 你能从你的应用程序中显示拨号界面吗?