Django第五日
路由层
路由匹配
# 错误示范
url(r'test',views.test),
url(r'testadd',views.testadd)
# 如上两个路由匹配,因为代码从上到下的顺序,哪怕输入了testadd,也会优先服从了正则test的匹配
# 所以正则逻辑要严谨 ^$号一定要加
url方法第一个参数是正则表达式
- 只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配
- 直接执行对应的视图函数
你在输入url的时候会默认加斜杠
django内部帮你做到重定向
一次匹配不行
url后面加斜杠再来一次
取消自动加斜杠 APPEND_SLASH
APPEND_SLASH = False/True
# 默认是自动加斜杠的
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 首页
url(r'^$',views.home),
# 路由匹配
url(r'^test/$',views.test),
url(r'^testadd/$',views.testadd),
# 尾页(目前了解即可,当所有路由都匹配不上时执行,后续会讲)
url(r'',views.error),
]
无名分组
分组:就是给某一段正则表达式用小括号扩起来
url(r'^test/(\d+)/',views.test)
def test(request,xx):
print(xx)
return HttpResponse('test')
- 无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数
有名分组
与无名分组的区别就在于,可以给正则表达式起一个别名
url(r'^testadd/(?P<year>\d+)',views.testadd)
def testadd(request,year):
print(year)
return HttpResponse('testadd')
- 有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数
无名有名是否可以混合使用
完全不允许,会直接报错
- 但单个种类的分组可以使用多次
url(r'^index/(\d+)/(\d+)/(\d+)/',views.index),
url(r'^index/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/',views.index),
反向解析
-
通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数,无论怎样更改路径名都照常
-
先给路由与视图函数起一个别名,具体语法:在路由后面加入参数
name='别名'
url(r'^func_kkk/',views.func,name='ooo')
-
反向解析示例
# 后端反向解析 from django.shortcuts import render,HttpResponse,redirect,reverse url = reverse('ooo') # url可以接收到路径str # 前端反向解析 <a href="{% url 'ooo' %}">111</a>
django2.0版本
对比1.0版本的区别
- 从2.x以后,路由建议使用path,是一个准确路径
- 使用正则方式,推荐使用re_path,用法跟url一模一样
path转化器
-
5个内置转换器
str
匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int
匹配正整数,包含0。
slug
匹配字母、数字以及横杠、下划线组成的字符串。
uuid
匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path
匹配任何非空字符串,包含了路径分隔符(/)(不能用?) -
语法示例,<转换器:别名>,这里的别名同有名分组的组名,用来传参
path('login/<int:year>', views.login),
path('login/<str:year>', views.login),
path('login/<path:p>', views.article),
-
高级例子
实现匹配这种路径:http://127.0.0.1:8000/liuqingzheng/p/4444.html
path('<str:name>/p/<int:id>.html', views.article),
re_path(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login),
url(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login),
# url在2.x以后不建议使用 -
转换器可以不可以在re_path中使用?不能!!!!
自定义转化器(不重要)
对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:
-
regex
类属性,字符串类型 -
to_python(self, value)
方法,value是由类属性regex
所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。 -
to_url(self, value)
方法,和to_python
相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。 -
在path中使用
path('<lqz:name>/', views.article),
代码示例:
# 创建一个converters.py
class FourDigitYearConverter:
regex = '[0-9]{4}'
# 一旦上面的正则表达式匹配成功,就会当作参数value传递进来
def to_python(self, value):
return int(value) # 这里返回的值,会当作参数传递给视图函数
# 反向解析时使用
def to_url(self, value):
return '%04d' % value
'''
视图函数的反向解析:需要给别名后面的路径拼接传参
位置传参url = reverse('反向解析别名',args[value,])
关键字传参url = reverse('反向解析别名',kwargs{'转换器别名':value,})
'''
url.py
from django.urls import register_converter, path
from . import converters, views
register_converter(converters.FourDigitYearConverter, 'yyyy')
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<yyyy:year>/', views.year_archive),
...
]