Django的路由系统(URL)
Django的路由系统就网站的URL目录,里面记录着浏览器发送过来的路径和后端处理的视图函数或类对应关系
就是告诉Django那个路径交给那个函数处理
路由系统基本配置
## 导入url模块
from django.conf.urls import url
urlpatterns = [
## 正则表达式匹配路径,后端处理视图函数
url(r'^admin/', admin.site.urls),
]
注意:
Django 2.0版本中的路由系统已经替换成下面的写法
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
具体可以参考 官方文档
分组匹配
正则表达式匹配路径时可以使用括号的方式进行定向匹配(可以多个),匹配成功Django会把匹配的数据(类型为字符串)作为参数传递给后面的函数(第一个参数为Django封装request对象,从第二个依次排列)
from django.conf.urls import url
urlpatterns = [
## 如url为:/host/1314/,视图函数拿到的第二个参数为1314,类型为字符串
url(r'^host/([0-9]+)/$', views.host),
url(r'^admin/([a-z]+)/([A-Z]+)/$', views.admin),
url(r'^index/([a-z]{3})/([A-Z]{1})/([0-9]+)/$', views.index),
]
注意:
Django的settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。
分组命名匹配
上面的匹配顺序是按照位置从前往后匹配,而分组命名匹配是给每一个匹配的参数命名,视图函数会根据名字找相应的数据
from django.conf.urls import url
urlpatterns = [
## 如url为:/host/1314/,视图函数id值为1314,类型为字符串
url(r'^host/(?P<id>[0-9]+)/$', views.host),
url(r'^admin/(?P<name>[a-z]+)/(?P<sur>[A-Z]+)/$', views.admin),
url(r'^index/(?P<name>[a-z]+)/(?P<sur>[A-Z]+)/(?P<id>[0-9]+)/$', views.index),
]
分级路由
分级路由是urls中只匹配开头的路径,后面的交给其他urls文件处理(一般都为app上的urls配置)
## 导入url和include模块
from django.conf.urls import include, url
urlpatterns = [
## url为blog开头的去掉blog/剩下的交给blog.urls处理
url(r'^blog/', include('blog.urls')),
]
命名URL与URL反向解析
命名URL就是给URL定义一个别名。不管URL以后会不会改变,我们只需要根据别名找到URL
在url匹配模式中,定义name="别名"
urlpatterns = [
url(r'^host/$', views.host, name="host"),
url(r'^admin/([0-9]+)/$', views.admin, name="admin"),
url(r'^index/(?P<name>[a-z]+)/(?P<sur>[A-Z]+)/$', views.index),
]
在模板中引用:
{% url 'host' %}
{% url 'admin' '1314' %} ## 1314为传给url分组匹配的参数
{% url 'index' name='san' sur='ZHANG' %}
在view视图函数用URL反向解析方式引用:
## 导入反向解析模块
from django.urls import reverse
reverse("host")
reverse("admin", args=("1314", ))
reverse("index", kwargs={'name': 'san', 'sur': 'ZHANG'})
命名空间模式
命名空间是为了即使不同APP之间有相同的URL别名也可以互不干扰
比如:
project中的urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^blog/', include('blog.urls', namespace='blog')),
url(r'^edu/', include('edu.urls', namespace='edu')),
]
blog APP中的urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^index/', view.index, name='index'),
]
edu APP中的urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^index/', view.index, name='index'),
]
现在在blog和edu的APP中都有别名为index的,我们就可以使用命名空间得到我们需要的URL
在模板中引用:
{% url 'blog:index' %} ## 引用blog上的index
{% url 'edu:index' %} ## 引用edu上的index
在view视图函数用URL反向解析方式引用:
## 导入反向解析模块
from django.urls import reverse
reverse('blog:index') ## 引用blog上的index
reverse('edu:index') ## 引用edu上的index