我的 Flask API 都使用电话作为可选的 url 参数,如下所示,我想使用装饰器来验证电话号码是否正确。
那么我可以在不解析请求url的情况下在某处获取参数“phone”吗?
@user_api.route("/<phone>/login")
@check_phone
def login(phone):
f = OrderedDict()
f['error'] = 0
return jsonify(f)
@user_api.route("/<phone>/logout")
@check_phone
def logout(phone):
f = OrderedDict()
f['error'] = 0
return jsonify(f)
Werkzeug(和 Flask)中有一个更好的机制来验证内置的 url 值。定义一个转换器 https://werkzeug.palletsprojects.com/en/1.0.x/routing/#custom-converters并像在路线中使用任何其他转换器一样使用它(例如,<int:id>
).
from werkzeug.routing import BaseConverter, ValidationError
class PhoneConverter(BaseConverter):
regex = r'\d{7,10}' # this validates the basic form of the value
def to_python(self, value):
# do more complicated validation
if not complicated_phone_validation(value):
raise ValidationError('not a valid phone number')
return value
app.url_map.converters['phone'] = PhoneConverter
@app.route('/<phone:phone>')
def get_phone(phone):
# phone is valid
您还可以使用before_request
函数使用电话参数验证所有路由,而无需全部装饰。
from flask import request, abort
@app.before_request
def valid_phone():
if 'phone' not in request.view_args:
return # view has no phone arg
if not complicated_phone_validation(request.view_args['phone']):
abort(404)
@app.route('/<phone>')
def get_phone(phone):
# phone is valid
@app.route('/<other>')
def get_other(other):
# no phone arg, no validation
如果您确实想使用装饰器,则可以使用参数调用装饰函数。
from functools import wraps
def check_phone(f):
@wraps(f)
def inner(**kwargs):
phone = kwargs['phone']
# do some validation
return f(**kwargs)
return inner
@app.route('/<phone>')
@check_phone
def get_phone(phone):
# phone is valid
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)