2013-08-21 19 views
0

我想要按照django教程來設置一個簡單的Django應用程序和Django Project,它提供兩個URL:「/」(index)和「/ testweb」。不能讓Django應用程序服務正確的URL

如果我導航到http://localhost:8000/testweb,我看到「index!」而不是「testweb!」 。我究竟做錯了什麼?

我的項目名爲testweb,我的應用程序名爲foo。這裏的testweb/urls.py

from django.conf.urls import patterns, include, url 
urlpatterns = patterns('', 
    url(r'^$', include('foo.urls')), 
    url(r'^testweb/', include('foo.urls')), 
) 

而這裏的foo/urls.py

from django.conf.urls import patterns, url 
from django.http import HttpResponse 
from foo import views 

urlpatterns = patterns('', 
    url(r'^$', (lambda x: HttpResponse("index!"))), 
    url(r'^testweb/', (lambda x: HttpResponse("testweb!"))), 
) 

回答

1

正如我所說的,Django是運行了兩個網址指數()。

鑑於你的代碼,當你去/testweb,Django的從testweb/urls.py第二行,然後在foo/urls.py第一線相匹配。嘗試/testweb/testweb。你會看到它運行(lambda x: HttpResponse("testweb!"))

發生這種情況是因爲您將兩個網址都指向了include('foo.urls')。進入/testweb/testweb/urls.py中的第二個URL匹配,並與includefoo.urls匹配,並在那裏查找匹配項。由於您的網址在/testweb/之後沒有任何內容,因此解析器會點擊foo.urls中的第一個網址,該網址用於index lambda。 include不同的URL配置或者乾脆直接引用的觀點,如:

# testweb/urls.py 
urlpatterns = patterns('', 
    url(r'^$', (lambda x: HttpResponse("index!")), name='index'), 
    url(r'^testweb/', (lambda x: HttpResponse("testweb!")), name='testweb'), 
) 

,你會得到你期望的結果。

+0

謝謝!有什麼方法可以更鬆散地將項目和應用程序連接起來嗎?我希望我可以配置該項目,以便它只是將某些URL傳遞給應用程序,然後依靠應用程序對其進行排序。 – loseeka

+0

是的,這就是'include'的意思。你的代碼存在的問題是,它包含了以'/'和'/ testweb'爲根的URL的確切行爲。將根URLConf('testweb/urls.py')更改爲指向不同URL的不同包含。 –

+0

當您進入'/ testweb'時,Django與'testweb/urls.py'中的第二行匹配,然後匹配'foo/urls.py'中的第一行。 –

相關問題