Django的路由定义
- 什么是路由?
指url与后端Django视图之间的一一映射关系 - 添加和匹配规则
1)urlpatterns列表从上到下进行匹配(路由寻址)
2)urlpatterns列表中条目一旦匹配成功,就会终止往下匹配
3)urlpatterns列表中条目匹配不成功,就会一直往下匹配
4)urlpatterns列表中如果包含了子路由会在找到子路由进行匹配,子路由找不到则会在主路由继续匹配
4)如果全部条目都匹配不成功,那么会抛出404异常(404页面) - path函数
1)用于定义路由条目
2)第一个参数为url路径参数(字符串),路径最前面不添加/,路径最后面需要添加/
3)第二个参数为视图函数或者类视图,如果添加的视图函数,一定不要使用()
4)第三个参数: kwargs任意个关键字参数可以作为一个字典传递给目标视图函数
5)第四个参数:name 你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。
6)如果第二个参数为include,那么会继续进入到子路由中匹配,子路由的匹配规则与全局路由匹配规则一致
7)第一个参数可以使用类型转化器
- <类型转化器:参数名称>
- 默认的类型转化器:int、str、slug、uuid
- 参数名称,在调用视图时,会自动传递给视图函数,需要使用同名的参数接收
- 主路由定义如下:
# 主路由定义 # from django.contrib import admin from django.urls import path, include, re_path # from projects.views import index, get_project from projects import views urlpatterns = [ # 使用类型装换器<类型转化器:参数名称> 会匹配int类型数据作为pk参数 path('projects/<int:pk>/', views.get_projects), # 使用re_path 可进行正则匹配 # as_view() 可以将类视图当做当前路由的对应的视图 re_path(r'(?P<username>\w{6,20})/count/$', ListUserCountView.as_view()), # include(子路由) 会到projects下的urls进行查找 path('', include('projects.urls')), # 回去找projects项目下的urls ]
- 子路由定义
from django.urls import path from . import views urlpatterns = [ path('projects/<int:pk>/', views.ProjectsView.as_view()), ]
- re_path的用法
re_path其实作用和path相似,都是匹配url路径后找到对应的视图进行处理,但是re_path使用正则进行匹配,可以理解成path的增强版 ;
具体使用如:# 这里是匹配邮箱格式,匹配到则存成变量,变量名称为email(后面会在视图函数中作为入参进行获取),并调用is_email_exist视图方法 re_path(r'(?P<email>^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$)/count/$', views.is_email_exist) # 视图中入参获取email def is_email_exist(self, request, email): print(email) pass