django第四天(路由别名,django2.x新特性和自定义转换器)

django第四天

路由别名

1.路由别名:
给路由路径命名一个名字
url(r'^login/$',views.login,name = 'login')
2.为什么要用路由别名
①当路由路径过长时,写起来会比较复杂,可以使用简短的别名,减少代码量
②当路由路径需要修改时,如果都是用路由路径的话,则扩展性较差,而使用别名来反向解析路由路径的话,只需要修改路由路径就ok了,扩展性高
3.如何用路由别名
在模板中.html文件
href = {% url '路由别名' 参数1,参数2...参数n%}
在重定向函数中
def login(request):
    url = reverse("路由别名")
    return redirect(url)    

名称空间

名称空间:当项目的应用较多时,别名可能存在相同的可能
此时可以定义名称空间,以保证查找的唯一性
如何用名称空间
主路由:
url(r'^app01/',include('app01.urls',namespace='app01'))
子路由:
    urlpatterns = [
        url(r'^test/',views.test,name ="test")
    ]
模板:
    {% url 'app01:test' %}
视图函数:
    url = reverse('app01:test')

2.x新特性

from django.urls import path,re_path
1.  2.x re_path的使用方式同1.x版本url
2.  path写的是绝对字符串,请求地址必须与路由地址完全匹配
3.  path拥有5个转换器:
    str:匹配除路径分隔符/外的字符串
    int:匹配自然数
    slug:匹配字母,数字,横杠及下划线组成的字符串
    uuid:匹配uuid形式的数据
    path:匹配任何字符串,包括路径分隔符/

自定义转换器

1.在应用文件夹下创建converter.py文件
2.在converter.py文件中创建自定义类
3.在类中定义regex 正则,
to_python方法
to_url方法
对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:
regex 类属性,字符串类型
to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

class CVT185Phone:
    regex = '185d{8}'
    def to_python(self, value):
        return int(value)
    def to_url(self, value):
        return '%11d' % value
4.在主路由下导入,生成转换器
from django.urls import register_converter
from app.converter import CVT185phone
register_converter(CVT185phone,'phone185')

path('page/<phone185:msg>/',views.page,name="pages")