多应用+插件架构,代码干净,支持一键云编译,码云点赞13K star,4.8-4.12 预售价格198元 广告
## 路由定义位置 django的路由是定义在 `urls.py` 文件下的 `urlpatterns` 列表中的。 `urls.py` 文件是路由解析的入口。 ```python from django.conf.urls import url from . import views urlpatterns = [ url(r'^', views.index, name="index") ] ``` 一般每个子应用为了独立,都有自己的 `urls.py` 来保存该应用的路由,然后使用 `include` 函数把子路由包含在主路由中。 ```python # 子路由 from django.conf.urls import url from . import views urlpatterns = [ url(r'^', views.index, name="index") ] ``` ```python # 使用include函数把子路由包含在主路由中 from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^demo/', include("demo.urls")) ] ``` 也可以把所有的路由都定义在主路由中,子应用不再设置。 ```python from django.conf.urls import url from django.contrib import admin from demo.views import index urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^demo/', index) ] ``` ## 路由的解析顺序 django的路由解析是从上到下的,django接收到一个请求后,他会从主工程的路由文件中 `urls.py`下的 `urlpatterns` 列表从上到下匹配,匹配到一个符合规则的路由,会执行后边的函数。如果后边是 `include` 函数,则会进入包含的子路由中,从上到下匹配。 如果django匹配到一个符合规则的路由,会立即执行后面的函数,而不会继续向下执行。所以,当上边的匹配规则如果包含了下边的规则,可能会把下边的路由屏蔽掉。 ```python urlpatterns = [ url(r'^say', views.say), url(r'^sayhello', views.sayhello), ] ``` 即使访问 `sayhello` 路径,他也会进入到 `say` 函数执行,因为他先匹配成功了 `say` 的路由规则。 所以定义路由规则描述要准确,或者用 `/` 结尾。 ## 路由命名 在定义路由的时候,可以指定第三个参数,来为路由起别名 1. 使用 `include` 定义的路由时,在 `include` 函数中使用关键字参数 `namespace` 定义命名空间 ```python urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^demo/', include("demo.urls", namespace="demo")) ] ``` - 命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。 2. 只使用 `url` 定义路由时,使用关键字参数 `name` 定义路由名字 ```python urlpatterns = [ url(r'^', views.index, name="index") ] ``` ## reverse反解析 使用reverse函数,可以根据路由名称,返回具体的路径,如: ```python from django.core.urlresolvers import reverse # 注意导包路径 def index(request): return HttpResponse("hello world!") def say(request): url = reverse('users:index') # 返回 /users/index/ print(url) return HttpResponse('say') ``` - 对于未指明namespace的,reverse(路由name) - 对于指明namespace的,reverse(命名空间namespace:路由name)