Flask 正则路由匹配——转换器
发布日期:2021-11-02 02:26:45 浏览次数:0 分类:技术文章

给路由传参

有时我们需要将同一类 URL 映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的个人信息。

路由传递参数

@app.route('/user/<user_id>')  #默认为str类型def user_info(user_id):    return 'hello %s' % user_id  # 用%是接收

路由传递的参数默认当做 string 处理,也可以指定参数的类型

路由传递参数指定类型

@app.route('/user/<int:user_id>')   # 指定int类型def user_info(user_id):    return 'hello %d' % user_id   # 使用%d接收

这里指定int,尖括号中的内容是动态的,在此暂时可以理解为接受 int 类型的值,实际上 int 代表使用 IntegerConverter 去处理 url 传入的参数

flask自带的类型有
#: the default converter mapping for the map.DEFAULT_CONVERTERS = {
       "default": UnicodeConverter,    "string": UnicodeConverter,    "any": AnyConverter,    "path": PathConverter,    "int": IntegerConverter,    "float": FloatConverter,    "uuid": UUIDConverter,}

自定义路由匹配——自动以转换器

在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问

具体实现步骤为:

  • 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
from werkzeug.routing import BaseConverter
  • 自定义转换器:自定义类继承于转换器基类
class RegexConverter(BaseConverter):    regex = r"[0-9]{6}"  # 规则:6位数字
  • 添加转换器到默认的转换器字典中
# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: reapp.url_map.converters['re'] = RegexConverter   # 此句很像是创建一个RegexConverter的实例对象但是后面不带括号
  • 使用自定义转换器实现自定义匹配规则
@app.route("/index/<re:uer_id>")def index(uer_id):    return "index %s" % uer_id

但是这种方式一个自定义转换器只能满足一个规则,所有肯定是不可行的


自定义带参路由匹配——带参转换器

定义代码如下:

class RegexConverter(BaseConverter):    def __init__(self, url_map, *args):        super(RegexConverter, self).__init__(url_map)        #BaseConverter.__init__(RegexConverter,url_map)  不喜欢用super的也可以这样写        # 将接受的第1个参数当作匹配规则进行保存        self.regex = args[0]#将自己定义的转换器添加到默认转换器列表中app.url_map.converters['re']=RegexConverter@app.route('/user/<re(r"[0-9]{6}"):user_id>')  # 在此处re()括号内填匹配规则def index(user_id):    return 'index  %s' % user_id
上一篇:Jinja2模板与模板继承
下一篇:Flask的状态保持和上下文管理