路由分发
路由分发
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'),
]
这个时候就永远也不会重名了,除非有程序员不遵守这种规则。