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方便记忆,用它即可
posted @ 2022-02-09 00:31  recordlife  阅读(113)  评论(0编辑  收藏  举报