本篇通过两个示例,讲解 Flask 自定义转换器的要点:
1、如果需要校验 URL 中 Path 的规则,在自定义转换器的 __init__()
方法中改写 (override)BaseConverter 的 regex
属性。或者在转换器所在类中直接对 regex
属性赋值,如 IntegerConverter:
class IntegerConverter(NumberConverter):
regex = r"\d+"
num_convert = int
2、如果要对 URL 中的 Path 值传给 view function 时进行改变,改写 (override) 自定义转换器的 to_python()
方法。该方法将 Path 转换为 Python 对象。
示例一
实现功能:URL Path 为 user id,在 view functiion 中显示为 user name。用户数据用 dict 表示,不从数据库中读取。
# ValidUsers.py
from werkzeug.routing import BaseConverter, ValidationError
_users = [
{'id': '1', 'username': 'Admin'},
{'id': '2', 'username': 'Stone'}
]
def find_user(userid):
for user in _users:
if userid == user['id']:
return user
class ValidUserConverter(BaseConverter):
def to_python(self, value):
if not find_user(value) is None:
return find_user(value)['username']
raise ValidationError()
Flask 程序使用 ValidUserConverter:
# app.py
from flask import Flask, jsonify, url_for
from ValidUser import ValidUserConverter
app = Flask(__name__)
app.url_map.converters['validuser'] = ValidUserConverter
@app.route('/')
def index():
return 'Home Page'
@app.route('/users/<validuser:userid>')
def greet_user(userid):
return jsonify({'Hello': userid})
if __name__ == "__main__":
app.run()
当客户端请求路径为:
localhost:5000/users/1
返回的 json 为:
{
"Hello": "Admin"
}
示例二
示例改写自博文后标注的参考文章,要实现的功能:允许在请求的 URL Path 中使用 + 号,转换器将 + 号连接的 Path 解析为 list,从而增加了查询的灵活性。比如可以同时查询 id 为 1、2、3 的用户信息。
# ListConverter.py
from werkzeug.routing import BaseConverter
class ListConverter(BaseConverter):
def to_python(self, value):
return value.split('+')
def to_url(self, values):
return '+'.join(str(value) for value in values)
Flask 程序使用 ListConverter:
# app.py
from flask import Flask, jsonify, url_for
from ListConverter import ListConverter
app = Flask(__name__)
app.url_map.converters['list'] = ListConverter
@app.route('/')
def index():
print(url_for('greet_user', users=[1, 4, 6]))
return 'Home Page'
@app.route('/users/<list:users>')
def greet_user(users):
names = ','.join(user for user in users)
return 'Hello: ' + names
if __name__ == "__main__":
app.run()
当客户端请求的 URL Path 为:
localhost:5000/users/1+2+5
传给 view function greet_user()
函数的参数被转换为 list(1,2,5),从而方便进行转换。
网友评论