2012-01-26 35 views
1

我有一個Django urls.py文件,像這樣:Django的urlconf有時候會失敗?

基礎文件:

urlpatterns = patterns('', 
    (r'^', include('sp.sp_app.urls')), 
    (r'^', include('sp.sp_api_activity.urls')), 
    (r'^', include('sp.sp_api_player.urls')), 
    (r'^', include('sp.sp_web.urls')), 
) 

在sp.sp_web.urls文件,我有以下幾點:

from django.conf.urls.defaults import * 
urlpatterns = patterns('superproof.superproof_web.views', 
    (r'^$','index'), #Shows your home page 
    (r'^challenge$','spcreatechallenge'), 
    (r'^player/`$','getlastactivity'), 
    (r'^yearlysummary/','yearlysummary'), 
    (r'^processchallenge$','processchallenge'), 
    (r'^activity/(\w{32})$','activitydetail'), 
) 

有時會每年加載一次url。其他時候,我得到一個404錯誤。這發生在完全相同的有效URL上。我不會更改網址或代碼中的任何內容。

當我打開調試時出現404錯誤時,我的年度總結網址模式不在列表中。

任何想法?

回答

0

一對夫婦的事情,我注意到,可能是一個問題......

我注意到你是不是你的命名空間包含的網址爲每個應用程序。不知道其他網址模塊是什麼樣的,我可以假設你可能會碰撞網址。我建議做這樣的事情:

urlpatterns = patterns('', 
    (r'', include('sp.sp_app.urls')), 
    (r'^activity/', include('sp.sp_api_activity.urls')), 
    (r'^player/', include('sp.sp_api_player.urls')), 
    (r'^web/', include('sp.sp_web.urls')), 
) 

通常情況下,當你有網址包括,它們是針對不同的應用程序,所以你會希望它們的命名應該避免兩個應用程序指定相同的URL模式。

另外,什麼是你的網址之一勾選?你的意思是期待嗎?

(r'^player/`$','getlastactivity'), 
0

JDI是點上,該分析。我會盡力解釋爲什麼有問題,在你的情況。

你會發現,如果包含(r'^', include('sp.sp_web.urls')在主urls.py第一模式下,您的視圖將始終正確加載。

當您將它作爲最後一個模式時,它與其他時間不匹配的原因是該模式與之前模式中的某個其他模式匹配,如[/w+]。調試頁面在URL模式的404上顯示了它匹配的模式之一的所有子URL模式。這正是爲什麼該模式不在調試頁面上顯示的URL上。

與jdi提到的一樣,這是一個很好的做法,可以正確命名空間,所以這不會發生。你甚至可以在沒有命名空間的情況下做到這一點,但是你的正則表達式必須是正確的,至少包括末尾字符$