作用和基本使用
作用:
用于校验请求的路由参数中的值是否符合符合指定的规则。
这个使用方法和django中的路由参数转换器是差不多的。
至于为什么用路径参数转换器,原因和django中的一样,虽然你可以在视图函数中校验,但是如果有好几个视图函数都要用到相同的校验规则,此时使用路径参数转换器就很好的体现了面向对象的封装思想。
基本语法:<转换器名称:路径参数名>
基本使用实例:
@app.route('/users/<int:user_id>')
# 路由参数中写的是user_id,视图函数中就必须要有这个参数接收
def user_info(user_id):
print(type(user_id))
return f"{user_id=}"
# 或者直接将视图函数的参数定义成*args, **kwargs,然后再获取
@app.route('/users/<int:user_id>')
def user_info(*args, **kwargs):
user_id = kwargs.get("user_id")
print(type(user_id))
return f"{user_id=}"
flask中自带的转换器,分别为:
#: the default converter mapping for the map.
DEFAULT_CONVERTERS: t.Mapping[str, type[BaseConverter]] = {
"default": UnicodeConverter,
"string": UnicodeConverter,
"any": AnyConverter,
"path": PathConverter,
"int": IntegerConverter,
"float": FloatConverter,
"uuid": UUIDConverter,
}
自定义转换器
自带的路径参数转换器很多时候都无法完全满足我们的需求,比如我们要校验手机号...又是手机号,没错..
步骤与django大同小异,都是先编写转换器类,然后注册使用。
第一步:编写继承BaseConverter的转换器类,并编写正则。
(和django不一样的是,django不需要继承某个类)
from werkzeug.routing import BaseConverter
class MobileConverter(BaseConverter):
# 编写正则表达式
# 注意:不能写^来匹配开头,但是可以用$匹配结尾。这和django的转换器也是一样的。
regex = r"1[3-9]\d{9}$"
def __init__(self, map, *args, **kwargs):
# 重写init方法可以做一些更多的功能,比如int转化器,可以这样用<int(max=199):age>
# 这种方式就是在init中初始化的,具体直接看NumberConverter
super().__init__(map, *args, **kwargs)
# 这里可以根据需要决定是否重写to_python方法
# 然后可以实现更多的功能,具体也可以参考NumberConverter
# if self.fixed_digits and len(value) != self.fixed_digits:
# raise ValidationError()
# value = self.num_convert(value)
# if (self.min is not None and value < self.min) or (
# self.max is not None and value > self.max
# ):
# raise ValidationError()
# return value
def to_python(self, value: str):
# 父类默认是直接返回value
return super().to_python(value)
django转换器:
class PhoneNumberConverter:
regex = r'1[3-9]\d{9}'
# to_python的作用是返回给视图
def to_python(self, value):
return str(value)
# to_urls是一个反向解析用的(了解即可,不实现也可以)
# def to_url(self, value):
# return str(value)
第二步:注册转换器
flask中:
# 注册自定义转换器,需要先注册才能在路由中使用。
# mobile就是在url路径参数中使用的名称
app.url_map.converters["mobile"] = MobileConverter
django中:
# 注册转换器,需要在urlpatterns前面注册,因为你要先注册才能用呀
# 先导入注册函数
from django.urls.converters import register_converter
# register_converter(转换器类, 在路由urls中使用的名称)
register_converter(PhoneNumberConverter, "phonecheck")
标签:URL,self,路径,value,django,user,转换器,id
From: https://www.cnblogs.com/juelian/p/17742116.html