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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值