簡體   English   中英

如何在裝飾器中獲取 Flask 可選 URL 參數?

[英]How can I get Flask optional URL parameters in a decorator?

我的 Flask API 都使用電話作為可選的 url 參數,如下所示,我想使用裝飾器來驗證電話號碼是否正確。 那么我可以在不解析請求 url 的情況下在某處獲取參數“電話”嗎?

@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 值。 定義一個轉換器並像使用路由中的任何其他轉換器一樣使用它(例如, <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函數來驗證所有帶有 phone 參數的路由,而不必全部裝飾它們。

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

    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM