给路由传参
有时我们需要将同一类 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