一、介绍
当一个用户请求 Django 站点的一个页面,下面是 Django 系统决定执行哪个 Python 代码使用的算法:
Django确定要使用的根URLconf模块,一般是在settings中的ROOT_URLCONF设置的值,但是如果传入 HttpRequest 对象具有一个urlconf 属性(由中间件设置),则其值将用于代替 ROOT_URLCONF设置。 Django加载该URLconf模块并查找变量 urlpatterns,它是一个列表django.urls.path() 和 / 或django.urls.re_path()实例。 Django按顺序遍历每个URL模式,并停在与请求的URL匹配的第一个URL模式,需要特别注意编写的顺序 一旦某个URL模式匹配,Django就会导入并调用给定的视图,该视图是一个简单的Python函数(或基于类的视图方法)。该视图通过以下参数传递:
一个HttpRequest实例。如果匹配的URL模式没有返回任何命名组,则来自正则表达式的匹配作为位置参数提供。关键字参数由路径表达式匹配的任何命名部分组成,并由可选的kwargs参数传给 django.urls.path()或django.urls.re_path()。 如果没有URL模式匹配,或者在此过程中的任何点发生异常,Django将调用适当的错误处理视图
二、基本使用
配置子应用urls.py
from django.urls import path
urlpatterns = [
path('user/',user),
path('user/info/',user_info),
path('user/
path('user/
path('user/
]
注意
从URL中捕获值,请使用尖括号捕获的值可以选择包含转换器类型。例如,用于
2.1、路径转换器
str:匹配任何非空字符串,不包括路径分隔符'/'。如果转换器不包含在表达式中,这是默认值。int:匹配零或任何正整数。返回一个int。slug:匹配由ASCII字母或数字组成的字符串,以及横线和下划线字符。例如: building-your-1st-django_site可以匹配,django_@site是不可以匹配的。uuid:匹配格式化的UUID。为防止多个URL映射到同一页面,必须包含破折号,并且字母必须是小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。path:匹配任何非空字符串,包括路径分隔符 '/',可以匹配完整的URL路径,而不仅仅是URL路径的一部分str,使用时要谨慎,因为可能造成后续的所有url匹配都失效。 path('articles/
#获取uuid
import uuid
print(uuid.uuid1())
三、自定义路径转换器 转换器是一个包含以下内容的类: 一个regex类属性,作为一个re匹配字符串 to_python(self, value)方法,它处理匹配的字符串转换成要传递到视图函数的类型 新建一个converters.py文件,在文件中定义一个FourDigitYearConverter类:
to_url(self, value)方法,用于处理将Python类型转换为URL中使用的字符 class FourDigitYearConverter(object):
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value
使用register_converter()方法在URLconf中注册自定义转换器类 : from django.urls import register_converter, path
from . import converters, views
register_converter(converters.FourDigitYearConverter, 'yyyy')
urlpatterns = [
path('articles/2030/', views.special_case_2030),
path('articles/
]
四、使用正则表达式 使用正则表达式匹配路径,请使用 re_path()而不是path() 在Python正则表达式中,命名正则表达式组的语法是(?P
from . import views
# url() 是 re_path 的别名,不推荐使用
urlpatterns = [
re_path(r'^articles/(?P
re_path(r'^articles/(?P
# 不推荐, 匹配 blog/page-3/
re_path(r'^blog/(page-(\d+)/)?$', blog_articles),
# 推荐 ,匹配:comments/page-2/ 路径到 comments(request, page_numer)
re_path(r'^comments/(?:page-(?P
]
注意事项
无论正则表达式匹配什么类型,每个捕获的参数都以字符串的形式发送到视图除了命名的组语法,例如(?P
推荐文章
发表评论