2009-11-23 106 views
11

如果我想给用户提供一个选项,使用https://而不是http://登录网站,我最好给他们一个选项,以在我的视图或模板中到达那里。Django - 使用{%url%}生成的链接 - 如何使它们安全?

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

我想能够只是做:

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

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

我怎样才能做到这一点?

+0

奇怪的是,虽然,为什么会任何用户想要通过HTTP当HTTPS登录可用? – Randell 2012-04-23 02:42:51

+1

因为他们的代理只允许端口80通过(看到这个畸变几次) – Kos 2013-05-19 16:20:13

回答

0

也许你可以编写一个标签url_https,它与url的功能完全相同,但指向的是HTTPS版本的url。

6

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

的Satchmo上bitbucked here

我也能找到一个片段的中间件也应该能够帮助你获得安全登录网址:

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

无论使用的Satchmo或中间件片段之一,你应该能够做到像

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

如果您想要将某些URL定义为仅限https,然后让中间件从此处处理它,则链接片段是一个很好的全面解决方案。如果你所要做的只是创建一个https链接,它们就会过度杀伤。 – 2009-11-23 22:17:15

+0

没错,只有一个环节,这是不值得的。在那种情况下你的解决方案会更好。 – googletorp 2009-11-24 06:27:30

18

{% 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 %}"> 
+0

虽然这有一个缺点,当/如果我把网站移动到不同的域名,或者类似的东西,相对URL不会中断,这个会。 我一直在寻找一些更像request.build_absolute_uri()函数的选项,用http代替http,但我想最好是自己实现它。 – kender 2009-11-23 21:01:30

+0

那么,没有办法强制https并使用相对URL。编辑提及您可以使用Sites框架来避免硬编码域名。 – 2009-11-23 22:08:37

+0

使用request.get_host的上述选项基本上与request.get_absolute_uri和强制https执行相同的操作。 – 2009-11-23 22:15:50