Flask 正则路由匹配——转换器

给路由传参

有时我们需要将同一类 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位数字
  • 添加转换器到默认的转换器字典中
# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
app.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章