Django中路由匹配,无名分组有名分组和反向解析
1.路由匹配的书写格式
Django项目的路由匹配是写在项目目录下urls.py文件中。当用户发来请求的时候,程序会拿用户的路由,在urlpatterns列表中从上到下进行匹配,一旦匹配上就会停止。在url()中,第一个位置的参数是正则表达式,正则的正确书写格式如下
# 最标准
urlpatterns = [
url(r'^……/$', ……)]
# 常用
urlpatterns = [
url(r'^……/', ……)]
下面就来详细说明,每个字符存在的意义。以 127.0.0.1:8000/exercise/为正确的路径进行展示
符号 | 作用 | 没有会怎样 |
---|---|---|
r | 取消转义 | 有些字符组合在一起会有特殊含义,而此处不需要那些功能 |
^ | 以什么开头 | 如果用户输入127.0.0.1:8000/gdahhfhsdhexercise/也能进行匹配 |
/ | 路由以什么终止 | 如果用户想找/exerciseadd/,而/exercise/在urlpatterns中排在/exerciseadd/前面,就匹配不到了 |
$ | 以什么结尾 | /exercise/fsadgfdsgaggdfshgadh/也能找到 |
补充说明:
- 用户在输入url的时候如果末尾不加/,问题也不大,因为django内部帮用户做到重定向,一次匹配不行,django会在url后面加斜杠再来一次
- url方法第一个参数是正则表达式,只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配,直接执行对应的视图函数
2.路由完善
首页完善
当用户仅访问http://127.0.0.1:8000/,后面不加东西的时候,不做任何处理的话,浏览器会显示Page not found (404)的报错页面,不太友好,所以直接将http://127.0.0.1:8000/设置成网站首页,具体的书写方式如下:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.home) # 首页
]
尾页完善
如果用户输入的路由就是本网站不存在的,需要给用户返回一个不存在页面,该路由放在最后,书写方式如下
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.home),
……,
url(r'', views.error) # 尾页
]
3.无名分组和有名分组
正则表达式里面的分组就是将正则表达式用()括起来,括号括起来的部分就叫分组,如果括起来的正则表达式有名字,那就叫有名分组,如果分组没有名字就要无名分组,在Django项目中url()中也可以使用分组,而且可以使用多个分组,但是有名分组和无名分组内的正则表达式会传给后面的视图函数,无名分组作为位置参数传,有名分组作为关键字参数传给视图函数,且两者不可混用。
(1) 无名分组的书写方法
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/(\d+)/……/(\d+)/(\d+)', views.home)
]
(2) 有名分组的书写方法
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/(?P<year>\d+)/……/(?P<month>\d+)/(?<day>\d+)', views.home)
]
4.反向解析
反向解析就是通过一些方法得到一个结果,该结果可以直接访问url得到相应的视图函数。
当修改一个路由名称的时候,前后端原来引用该路由的地方也要进行修改,不然就无法匹配相应的视图函数,这时候全部手动操作就显得极其麻烦,所以需要特别的处理。当路由发生变化时,前后端引用该路由的时候都能连带变化。下面就来详细讲解不带分组的普通正则,含有无名分组正则与含有有名分组三种反向解析的方法。
(1) 不带分组的反向解析
具体的操作如下
步骤1:先给路由与视图函数匹配起别名
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/', views.home, name='路由与视图函数的别名') # 别名可以任意取
]
步骤2:前端引用
{% url '路由与视图函数的别名' %}
# 在需要使用路由的地方写上这个东西即可,即对应的路由
步骤3:后端引用
from django.shortcuts import reverse
def home(request, args)
res = reverse('路由与视图函数的别名') # 返回的值就是对应的路由
(2) 无名分组的反向解析
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/(\d+)/', views.home)
]
# 后端
from django.shortcuts import reverse
def home(request,args)
res = reverse('路由与视图函数的别名', args=(任意一个数字,)) # 该数字一般为数据的主键值
# 前端
{% url '路由与视图函数的别名' 任意一个数字 %} # 该数字一般为数据的主键值
# 举例
url(r'^edit/(\d+)/',views.edit,name='xxx')
def edit(request,edit_id):
reverse('xxx',args=(edit_id,))
{%for user_obj in user_queryset%}
<a href="{% url 'xxx' user_obj.id %}">编辑</a>
{%endfor%}
(3)有名分组的反向解析
url(r'^func/(?P<year>\d+)/',views.func,name='ooo')
# 前端
<a href="{% url 'ooo' year=123 %}">111</a> # 法1
<a href="{% url 'ooo' 123 %}">222</a> # 法2方便记忆,用它即可
# 后端
print(reverse('ooo', kwargs={'year':123})) # 法1
print(reverse('ooo', args=(111,))) # 法2方便记忆,用它即可