文章摘自北京理工大学嵩天老师云端入门系列课程,这里只是我个人的笔记。
diango的url路由配置
路由是关联url及其处理函数关系的过程
setting.py文件中ROOT_URLCONF变量指定全局路由文件名称
ROOT_URLCONF = ‘<工程名称.urls>’ # 默认对应工程目录下urls.py文件
Django使用urlpatterns变量表示路由(urls.py),该变量是列表类型,由path()或re_path()作为元素组成
urlpatterns = [
path('msggate/', include('msgapp.urls')),
path('admin/', admin.site.urls),
]
Django的URL路由流程
(1)Django查找全局urlpattern变量(urls.py)
(2)Django按照先后顺序,对URL逐一匹配urlpattern每个元素
(3)在找到第一个匹配时,停止查找,根据匹配结果执行对应处理函数
(4)如果没有找到匹配或出现异常,Django进行错误处理
注意:Django的路由不考虑HTTP请求方式,仅根据URL进行路由,即只要url相同,无论POST,GET等哪种请求方式都指向同一个操作函数
路由:path()和re_path()
path()处理字符串路由,re_path()处理正则表达式路由
url字符串:path(route,view)
正则表达式:re_path(route,view)
path(route,view,kwargs=None,name=None)路由函数
- route :URL或URL模式,Django定义的URL转换语法
- view:处理(视图)函数的名称,或include()类
- kwargs:向处理函数提供的额外参数,以字典形式表示
- name:给URL模式的命名
route的格式和转换
from django.urls import path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
Django支持三种方式表达route
• (1) 精确字符串格式:articles/2003/
• (2) Django的转换格式:<类型:变量名>,articles/int:year/
• (3) 正则表达式格式:articles/(?P[0-9]{4}/
(1) 精确字符串格式
• 一个精确URL匹配一个操作函数
• 最简单形式,适合对静态URL的响应
• URL字符串不以 / 开头,但要以 / 结尾
articles/2003/
(2) Django的转换格式
• 一个URL模板,匹配URL同时在其中获得一批变量作为参数
• 常用形式,目的是通过URL进行参数获取和传递
• 采用 <类型:变量名> 格式获取参数
请求URL: articles/2018/
Django的转换格式: articles/int:year/
匹配 : year: 2018
转换格式类型 | 说明 |
---|---|
str | 匹配除分隔符(/)外的非空字符串,默认类型 等价于 str:year |
int | 匹配0和正整数 |
slug | 匹配字母、数字、横杠、下划线组成的字符串,str的子集 |
uuid | 匹配格式化的uuid,如: 075194d3-6885-417e-a8a8-6c931e272f00 |
path | 匹配任何非空字符串,包括路径分割符,是全集 |
(3) 正则表达式格式
• 借助正则表达式丰富语法表达一类URL (不是一个)
• 可以通过<>提取变量作为处理函数的参数,高级用法
• 使用re_path()函数
articles/([0-9]{4})/
• 使用re_path()函数,两种具体形式:
• 简单形式 (pattern),不提取参数:articles/([0-9]{4})/
• 命名形式 (?Ppattern),提取参数,统一为str类型:
articles/(?P[0-9]{4})/
路由函数path(route, view, kwargs=None, name=None)
· route : URL或URL模式,Django定义的URL转换语法
· view : 处理(视图)函数的名称,或include()类
· kwargs: 向处理函数提供的额外参数,以字典形式表示
· name : 给URL模式的命名
view的使用
View包括两种类型:处理函数和include()函数
• 处理函数:views.py中处理URL的对应函数,URL处理的归宿
urlpatterns = [
path(‘help/’, views.help),
path(‘sub/’ , views.sub),
]
• include()函数:包含其他路由信息的函数,分段路径组合形成总路径
View包括两种类型:处理函数和include()函数
urlpatterns = [
path(‘entry/’, include(‘appA.urls’)),
]
urlpatterns = [
path(‘help/’, views.help),
path(‘sub/’, views.sub),
]
http://127.0.0.1:8000/entry/help/ --> views.help()
http://127.0.0.1:8000/entry/sub/ --> views.sub()
- include()用法:1) 附加本地路由; 2) 路径去重
URL根目录的处理
http://127.0.0.1:8000/ 的响应
urlpatterns = [
path(’’, <根目录处理函数>),
re_path(’^$’, <根目录处理函数>), # 或者,二选一
]