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

Django-使用{%url%}生成的链接-如何使它们安全?,django,https,url-routing,Django,Https,Url Routing,如果我想让用户使用https://而不是http://登录网站,我最好给他们一个在我的视图或模板中登录的选项 我希望在我的登录页面上有“使用安全连接”的链接,但是,如果不硬编码URL,我怎么做呢 我希望能够做到: {% url login_page %} {% url login_page_https %} 并让他们指向http://example.com/login和https://example.com/login 我该怎么做 也许您可以编写一个标签url\u https,它与url做的

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

我希望在我的登录页面上有“使用安全连接”的链接,但是,如果不硬编码URL,我怎么做呢

我希望能够做到:

{% url login_page %}
{% url login_page_https %} 
并让他们指向
http://example.com/login
https://example.com/login


我该怎么做

也许您可以编写一个标签
url\u https
,它与
url
做的事情相同,但指向url的https版本。

我对安全url做得不多,但我对satchmo做了一些工作,它有一个中间件和一些UTIL。中间件只是在视图参数中检查key
SSL=True
,并通过这种方式使请求安全。您可能不需要让它变得那么复杂,但是您可以看看它是如何实现的

萨奇莫正在受苦受难

我还找到了一个Middleware的代码片段,它也应该能够帮助您获得一个安全的登录url:

第一个是原始版本,而第二个应该是ab改进版,在某些情况下,但可能不再是这样。你可以看看

使用satchmo或中间件代码片段,您应该能够执行以下操作

{% url login_page %}
{% url login_page SSL=1 %}

{%url%}
标记只生成url的路径部分,而不是主机部分。它只生成“/path/to/here”之类的内容(只需“查看源代码”,您就会看到
href
的全部内容)。它是您的浏览器,假设您当前所在的链接也应该在其中。因此,要在模板中生成安全链接,您只需执行以下操作:

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

但这有一个缺点;当/如果我将站点移动到不同的域或类似的地方,相对URL不会断开,这个会断开。我在寻找更像request.build_absolute_uri()的函数,该函数带有用https替换http的选项,但我想最好是自己实现。好吧,没有办法强制https并使用相对URL。编辑后提到,您可以使用站点框架来避免对域名进行硬编码。上述使用request.get_host的选项基本上与request.get_absolute_uri和强制https做了相同的事情。如果您只想将某些URL定义为https,然后使用中间件,则链接片段是一个很好的综合解决方案从那里照顾它。如果你只想创建一个https链接,那就太过分了。没错,仅仅一个链接就不值得这么做。在这种情况下,您的解决方案会更好。但奇怪的是,当https可用时,为什么任何用户都希望通过http登录?因为他们的代理只允许端口80通过(这种异常出现了几次)
<a href="https://{{ site.domain }}{% url blah %}">
<a href="https://{{ request.get_host }}{% url blah %}">