2009-11-23 35 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

相關問題