Django新手上路——路由匹配 1
1. URL
1.1 定义
URL即统一资源定位符,网络资源的地址,包含对应文件的位置和浏览器对该资源的处理方式。
1.2 格式
schema://host[:port#]/path/.../[?query-string][#anchor]
# 栗子:http://zdq.com/index/
- **schema:**协议,如http,https,ftp等;
- **host:**地址或域名;
- **port:**端口号,http默认端口80;
- **path:**资源路径,用于匹配需要访问的资源;
- **query-string:**向服务器发送的数据参数;
- **anchor:**锚点。
2. Django路由系统
2.1 urls.py作用
- URL加载是从配置文件——urls.py开始的。Django项目中urls.py文件是一张映射表,将项目中申明好的URL模式同相对应视图函数建立映射关系。
- 通俗来讲,他告诉Django项目,怎么样从URL中的path找到对应的处理方式(视图函数views.py)。
- 只有输入的URL的path与配置文件中的路径参数一致时,才会找到对应的视图函数。举个栗子,下面的urls.py文件匹配到的URL应为http://127.0.0.1:8000/index/
from . import views
from django.urls import path
urlpatterns = [
path('index/', views.index) #调用同目录下views.py文件中的index方法
]
2.2 路由系统流程
- 收到请求,在URLconf模块(项目目录下的urls.py文件)中查找匹配规则
- 规则写在变量urlpatterns中;
- urlpatterns变量是一个列表,其元素为django.urls中函数对象path或re_path,详见下文。
- 开始匹配
- 若匹配到,则停止匹配,即匹配结果为映射表中符合条件的第一个映射关系;
- 若未匹配到则返回状态码404。
3. path匹配
3.1 格式
def path(roule, view, kwargs=None, name=None):
pass
- **roule:**必选,字符串,申明匹配规则;
- **view:**必选,函数对象,定义于views.py,包括对请求的处理方式和视图调度;
- **kwargs:**可选,字典,额外参数、传递给view;
- **name:**url的命名。
3.2 传参
# 通常使用<变量名>捕获URL中path的值传给视图 栗如:
urlpatterns = [
path('index/<stu_id>/', views.index)
]
# 对应的视图方法必须使用同名参数进行接收,否则报错。
def index(request, stu_id)
3.2 转换器
urlpatterns = [
path('path/<converter:parameter>/', views.view_func)
]
- **converter:**转换器名称(类型);
- **pamter:**需要捕获的变量名;
- 若输入的url不满足转换器规则,则匹配失败返回404;
转换器名称 匹配规则 int 整数 slug 字母、数字、下划线、连接符组成的字符串 str 除去路径符(/)之外的非空字符串 path 非空字符串,允许路径符(/)存在 uuid 格式化的uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)、16进制
#要注意的是:变量名必须在对应的视图函数中加以申明
#此处的stuid与name会在函数index中申明
urlpatterns = [
path('index/<int:stu_id>/<str:name>/', views.index),
]
#views.py中的视图函数
def index(request, stu_id, name):
pass
'''
小技巧:若两个变量转换器类型相同(一般为str),可使用拼接技巧,转换为一个变量。例如:路由表:path('index/<id>-<name>/', views.index),
url: host:8000/index/12-tom,
视图函数: def index(request, id, name):
pass
'''
4. re_path匹配
4.1 概述
re_path即在path匹配规则中加入正则语法,使匹配机制更加完善且灵活,能够更加切合需求进行匹配。
例如:有一个业务需要通过路径传递月份,需要输入数字在1-12之间,普通的path匹配机制无法做到,虽然可以将数据放到后台去判断处理,但如果在前端可以解决这个问题的话可以降低后台开销。这种需求可以通过re_path来实现。
4.2 格式
#re_path格式为:re_path(r'path/(?P<parameter>re)/', views.function)
urlpatterns = [
re_path(r'index/(?P<month>[1-9]|1[0-2])/', views.index),
]
# 限制参数month的取值区间是1-12
- parameter:需要录入的参数;
- re:正则表达式
4.3 总结
- url匹配机制只与网址的path部分有关,不管请求是方法是post或get
东强出品,必数精品 ↩︎