路由分发

路由分发

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'),
]

这个时候就永远也不会重名了,除非有程序员不遵守这种规则。

原文地址:https://www.cnblogs.com/chanyuli/p/11723483.html