转换器
---------
`path converters` -- 路径转换器
未显式指定转换器时,默认使用 `str`。
- `str`- 匹配除路径分隔符 `/` 之外的任何非空字符串。
- `int` - 匹配零或任何正整数。返回一个 int。
- `slug` - 匹配由ASCII字母或数字组成的任何slug字符串,以及连字符和下划线字符。例如:`aD-m_iN`。
- `uuid` - 匹配格式化的UUID。要防止多个URL映射到同一页面,必须包含短划线并且字母必须为小写。例如:`075194d3-6885-417e-a8a8-6c931e272f00`。返回一个 UUID 实例。
- `path`- 匹配任何非空字符串,包括路径分隔符 '/'。这使您可以匹配完整的URL路径,而不仅仅是URL路径的一部分str。
例子:
~~~
# polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('<uuid:uuid>/', views.uuid, name='uuid'),
path('<slug:slug>/', views.slug, name='slug'),
path('<prefix>/<path:path>/', views.path, name='path'),
]
# polls/views.py
from django.http import HttpResponse
def uuid(request, uuid):
return HttpResponse(str(uuid))
def slug(request, slug):
return HttpResponse(slug)
def path(request, prefix, path):
return HttpResponse(path)
''' 匹配结果:
http://127.0.0.1:8000/polls/0435671e-9c84-11e8-acca-005056c00008/
--> 0435671e-9c84-11e8-acca-005056c00008
http://127.0.0.1:8000/polls/aD-m_iN/
--> D-m_iN
http://127.0.0.1:8000/polls/prefix/foo/bar/
--> foo/bar
'''
~~~
自定义转换器
-----------------
转换器是一个包含以下内容的类:
- 属性: `regex` ,正则字符串。
- 方法: `to_python(self, value)`,将捕获值转换为指定 Python 格式。传给视图函数调用。
- 方法: `to_url(self, value)`,反向解析 URL 时,`reverse()` 间接调用,将参数转换成字符串,以生成 URL。
~~~
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 path, register_converter
from . import converters, views
register_converter(converters.FourDigitYearConverter, 'yyyy')
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<yyyy:year>/', views.year_archive),
...
]
~~~
匹配 URL:`http://127.0.0.1:8000/polls/articles/2014/`
uuid
-----
uuid 是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现。
python中自带了uuid模块来进行uuid的生成和管理工作。
- `uuid.uuid1()` -- 基于时间戳。由MAC地址、当前时间戳、随机数生成。可以保证全球范围内的唯一性,但MAC的使用同时带来安全性问题,局域网中可以使用IP来代替MAC。
- `uuid.uuid2()` -- 基于分布式计算环境DCE(Python中没有这个函数)。算法与uuid1相同,不同的是把时间戳的前4位置换为POSIX的UID。实际中很少用到该方法。
- `uuid.uuid3(namespace, name)` -- 基于名字的MD5散列值。通过计算名字和命名空间的MD5散列值得到,保证了同一命名空间中不同名字的唯一性,和不同命名空间的唯一性,但同一命名空间的同一名字生成相同的uuid。
- `uuid.uuid4()` -- 基于随机数。由伪随机数得到,有一定的重复概率,该概率可以计算出来。
- `uuid.uuid5(namespace, name)` -- 基于名字的SHA-1散列值。算法与uuid3相同,不同的是使用 Secure Hash Algorithm 1 算法。
一般而言,在对uuid的需求不是很复杂的时候,uuid1方法就已经够用了。
~~~
import uuid
name = 'foo'
namespace = uuid.NAMESPACE_URL
print(uuid.uuid5(namespace, name))
~~~
- 开始
- 安装 django
- 配置语言、时区
- 创建项目
- 执行项目
- Applications
- 应用
- 配置应用
- INSTALLED_APPS
- django apps 包
- AppConfig 子类
- 应用的复用
- 路由
- URLconf
- path
- 转换器
- re_path
- 捕获参数
- URL 反向解析
- include
- 额外参数
- URL 命名空间
- Settings
- Core Settings
- INSTALLED_APPS
- django API
- apps
- config.py -- AppConfig 类
- registry.py -- Apps 类
- db
- models.fields 包
- 字段类型
- 字段选项
- null、blank
- 模型
- 简介
- 字段
