2009-10-20 138 views
57

我有兩個應用程序位於兩臺獨立的計算機上。在計算機A上,在urls.py文件我有類似下面的一行:沒有結尾斜槓的django網址不重定向

(r'^cast/$', 'mySite.simulate.views.cast') 

而且這個網址,才能既爲mySite.com/cast/mySite.com/cast工作。但是,計算機上的BI有寫出來像一個類似的URL:

(r'^login/$', 'mySite.myUser.views.login') 

對於在計算機B上的一些原因,url mySite.com/login /會工作,但mySite.com/login將掛起,並像它會在計算機上A.是不會直接回mySite.com/login/有什麼我錯過了? url.py這兩個文件看起來與我完全相同。

回答

73

檢查APPEND_SLASH設置在settings.py文件

more info in the django docs

+2

「設置爲True時,如果請求的URL不符合任何格式的URL配置和它不會以斜線結尾,HTTP重定向會發送到同一個URL,並附有斜槓。請注意,重定向可能會導致POST請求中提交的任何數據丟失。「 「APPEND_SLASH設置僅在安裝了CommonMiddleware的情況下使用...」。我更喜歡邁克爾傑恩的答案,提供更清晰的解決方案。 – Wtower 2015-02-11 09:26:01

+0

如果您在urlpatterns的最後一項使用額外的「全部捕獲」url,則這不起作用。 @ speedplane的答案即使在這種情況下也能奏效。但是,當然,這更簡單,應該在沒有「全部捕獲」urlpattern條目時使用。 – np8 2017-08-16 17:51:25

139

或者你可以寫你的URL是這樣的:

(r'^login/?$', 'mySite.myUser.views.login') 

結尾的斜線後的問題跡象使得它在可選正則表達式。如果由於某些原因您不想使用APPEND_SLASH設置,請使用它。

+6

打電話給我天真 - 但爲什麼這個答案有一百萬upvotes和django常見問題解答中的條目? – 2012-10-31 00:13:08

+35

很確定你不想爲了SEO而做這件事 - 最好是重定向到一個規範的URL,而不是有兩個有效的URL。 – 2012-12-12 16:06:05

+35

如果您使用Django創建RESTful API,當開發人員將數據直接發佈到端點URL時,這可能是一個很好的解決方案。當使用'APPEND_SLASH'時,如果他們意外地發送了它而沒有結尾斜槓,並且您的urlconf使用了尾部斜槓,那麼他們會在重定向POST請求時收到關於數據丟失的異常。 – OrPo 2013-05-01 10:46:17

0

我遇到了同樣的問題。在我的情況下,它是由一些老版本陳舊遺留在urls.py,從staticfiles前:

url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 
    'django.views.static.serve', 
    kwargs={'document_root': settings.MEDIA_ROOT}), 

MEDIA_URL是空的,所以這個模式匹配一​​切。

2

我也有同樣的問題。我的解決方案是在我的正則表達式的結束行之前放置一個(| /)。

url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),

9

這提高了@邁克爾Gendin的答案。他的回答服務於具有兩個獨立URL的相同頁面。這將是最好有login自動重定向到login/,然後成爲後者的主要頁面:

from django.conf.urls import patterns 
from django.views.generic import RedirectView 

urlpatterns = patterns('', 
    # Redirect login to login/ 
    (r'^login$', RedirectView.as_view(url = '/login/')), 
    # Handle the page with the slash. 
    (r'^login/', "views.my_handler"), 
) 
+2

這是一個非常好的和明顯的方式! – Nevertheless 2017-02-05 14:28:51

相關問題