Django - 用{%url%}生成的链接 - 如何使它们安全?

时间:2009-11-23 20:05:57

标签: django https url-routing

如果我想为用户提供使用https://而不是http://登录网站的选项,我最好在他的视图或模板中为他们提供选项。

我想在我的登录页面上找到“使用安全连接”链接 - 但是,如何在不对网址进行硬编码的情况下执行此操作?

我希望能够做到:

{% url login_page %}
{% url login_page_https %} 

并让他们指向http://example.com/loginhttps://example.com/login

我该怎么做?

3 个答案:

答案 0 :(得分:19)

{% url %}标记仅生成URL的路径部分,而不是主机部分。它只生成类似“/ path / to / here”的东西(你需要做的就是“查看源代码”,你会发现它是href的全部内容)。这是您的浏览器,假设您当前在http://example.com,该链接也应位于http://example.com内。因此,您需要做的就是在模板中生成安全链接:

<a href="https://example.com{% url blah %}">

如果您不想对域名进行硬编码(我不愿意),您可以使用the Site object并使其看起来像:

<a href="https://{{ site.domain }}{% url blah %}">

或者,如果您不想使用网站框架,可以使用request.get_host

<a href="https://{{ request.get_host }}{% url blah %}">

答案 1 :(得分:6)

我没有使用安全网址,但我已经使用了satchmo,它有一个中间件和一些实用工具。中间件只是在视图参数中检查密钥SSL = True,并以这种方式使请求安全。你可能不需要那么复杂,但你可以看看它是如何实现的。

Satchmo是bitbucked here

我还能找到中间件的片段,这些片段也应该可以帮助您获得安全的登录URL:

第一个是原版,而第二个应该是改进版本,在某些时候,但可能不再是这种情况。你可以看看它们。

使用satchmo或其中一个中间件片段,您应该可以执行类似

的操作
{% url login_page %}
{% url login_page SSL=1 %}

答案 2 :(得分:0)

也许您可以编写与url_https完全相同的标记url,但指向网址的HTTPS版本。