gpt4 book ai didi

python - 如何在装饰器中获取 Flask 可选 URL 参数?

转载 作者:太空狗 更新时间:2023-10-30 03:00:10 25 4
gpt4 key购买 nike

我的 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 值。定义一个 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('/<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


关于python - 如何在装饰器中获取 Flask 可选 URL 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30314434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com