Django如何处理请求
当一个用户请求一个页面时, Django根据以下逻辑执行操作
- 决定要使用的根URLconf模块 通常是
ROOT_URLCONF
设置的值, 但是如果传入的HttpRequest对象具有urlconf属性, 则其值会代替ROOT_URLCONF
设置. - 加载该模块并寻找可用的urlpatterns.
- 依次匹配每个URL模式, 在与请求的URL相匹配的第一个模式停下来.
- 导入并调用匹配行中给定的视图
path转换器
str : 匹配任何非空字符串, 但不包含斜杠, 如果没有专门指定转换器, 默认使用该转换器
int : 匹配0和正整数, 返回一个int类型
slug : url在最后的一部分解释性字符
uuid : 匹配一个uuid格式的对象.
path : 匹配任何非空字符串. 可以包含路径分隔符’/’ .
自定义path转换器
path转换器其实就是一个类, 包含以下成员和属性
- 类属性
regex
: 一个字符串形式的正则表达式属性. to_python(self, value)
方法 : 一个用来将匹配到的字符串转换为想要的数据类型, 并传递给视图函数to_url(self, value)
方法 : 将Python数据类型转换为一段url的方法,
例如 : 新建一个converters.py文件, 与urlconf同目录
class FourDigitYearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value
在URLconf中使用register_converter注册它 :
from django.urls import register_converter, path
from . import converters, views
register_converter(converters.FourDigitYearConverterm 'yyyy')
urlpatterns = [
path('articles/<yyyy:year>/', views.year_archive)
]
使用正则表达式
使用re_path()方法.
匹配部分
请求的URL被看做是一个普通的Python字符串, URLconf在其上进行匹配时将不包括GET或POST请求方式的参数以及域名
例如, 在https://www.myblog.com/myapp/
的请求中, URLconf将查找 myapp/
在 https://www.myblog/myapp/?page=3
的请求中, URLconf也将查找 myapp/
指定视图参数的默认值
from django.urls import path
from . import views
urlpatterns = [
path('blog/', views.page),
path('blog/page<int:num>/', views.page),
]
# 视图
def page(request, num=1):
pass
上面的URL模式指向同一个视图views.page
. 但是第一个模式不会从URL中捕获任何值, 如果第一个模式匹配, page()函数将使用num参数的默认值 “1” , 如果第二个模式匹配, page()将使用捕获的num值