路由分發
django里面的app可以有自己的static文件,templates文件夾,urls.py(******)
項目名下面的urls.py不再做路由與視圖函數對應關系
而是做一個中轉站 只負責將請求分發到不同的app中
然后在app的urls.py完成路由與視圖函數的對應關系
比如說我有十個人要開發,每個人都不需要溝通,只用開發自己的那個app就好了,你的老板只需要建立一個空的Django項目,把你們每個人的app拿過來,在settings里面注冊一下,然后在urls里面路由分發一下就好了。
這時候比如說你的app01和app02 都有一個index函數:
from app01 import urls as app01_urls
from app02 import urls as app02_urls
from django.conf.urls import url,include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))
]
接下來你只需要在瀏覽器里面請求 “127.0.0.1:8080/app01/index/"訪問到app01里面的index了,改成app02就能訪問到app02的index。
這時候就出了一個問題,如果有非常非常多的app,怎么辦?
難道老板要狂寫 from appxx import urls as appxx_urls 嗎?
所以以上的方式就叫做麻瓜式,並不好用。
第二種方式:
from app01 import urls as app01_urls
from app02 import urls as app02_urls
from django.conf.urls import url,include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include('app01.urls ')),
url(r'^app02/',include('app02.urls'))
]
用字符串來就可以了,省去了導入這些語句
現在又有一個問題,兩個app,是不是都可以給自己的index起別名!
那么反向解析的時候會怎么樣,Django能不能幫你自動識別出來呢?
結果是不行,他還沒有智能到區分到那個應用上,所以有兩種方式來解決:
方式一、名稱空間(了解)
from app01 import urls as app01_urls
from app02 import urls as app02_urls
from django.conf.urls import url,include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include(app01 _urls,namespace='app01')),
url(r'^app02/',include(app02_urls,namespace='app02'))
]
現在就相當於給他們搞了個名稱空間,我們在解析的時候:
這是app01的index
def index(request):
print(reverse('app01:index'))
return HttpResponse('hahaa')
app02的也一樣。
那么這不就是要員工們都提前溝通好了嗎,說自己要怎么寫怎么寫。所以有了方式二
方式二、約定俗成
通常情況下,起別名的時候,前面可以加上你的應用名,因為應用是不可能會重名的,所以只需要在你起別名的時候,在前面加上應用名就好了。
比如在你app01的urls里面
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/',views.index,name='app01_index'),
]
這個時候就永遠也不會重名了,除非有程序員不遵守這種規則。