有一种更好的机制可以验证内置到Werkzeug(和Flask)中的url值.定义一个converter并像使用路由中的任何其他转换器一样使用它(例如,< 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('/')
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('/')
def get_phone(phone):
# phone is valid
@app.route('/')
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('/')
@check_phone
def get_phone(phone):
# phone is valid