Flask将POST参数传递给自定义装饰器

时间:2015-11-13 06:03:19

标签: python flask http-post

我看过关于传递GET参数和硬编码参数herehere的帖子。

我要做的是将POST参数传递给自定义装饰器。 route实际上并不是在渲染页面,而是处理一些内容并通过AJAX调用将结果发回。

装饰者看起来像这样:

# app/util.py

from functools import wraps
from models import data

# custom decorator to validate symbol
def symbol_valid():
    def decorator(func):
        @wraps(func)
        def decorated_function(symbol, *args, **kwargs):
            if not data.validate_symbol(symbol):
                return jsonify({'status': 'fail'})
            return func(*args, **kwargs)
        return decorated_function
    return decorator

视图看起来像这样:

# app/views/matrix_blueprint.py

from flask import Blueprint, request, jsonify

from ..models import data
from ..util import symbol_valid

matrix_blueprint = Blueprint('matrix_blueprint', __name__)

# routing for the ajax call to return symbol details
@matrix_blueprint.route('/route_line', methods=['POST'])
@symbol_valid
def route_line():
    symbol = request.form['symbol'].upper()
    result = data.get_information(symbol)
    return jsonify(**result)

我知道当我通过@symbol_valid()传递参数GET时我实际上可以调用/quote_line/<symbol>,但我需要POST

那么问题是我的装饰者如何访问POST ed变量?

2 个答案:

答案 0 :(得分:1)

简单的解决方案。将Flask的request模块导入到包含装饰器的util.py模块中。也删除了外部功能。

参见代码:

# app/util.py

from flask import request # <- added

from functools import wraps
from models import data

# custom decorator to validate symbol

def symbol_valid(func):
    @wraps(func)
    def decorated_function(*args, **kwargs): # <- removed symbol arg
        symbol = request.form['symbol'] # <- paramter is in the request object
        if not data.validate_symbol(symbol):
            return jsonify({'status': 'fail'})
        return func(*args, **kwargs)
    return symbol_valid

答案 1 :(得分:0)

decorator接受func参数。您必须使用@symbol_valid()之类的装饰器或使函数symbol_valid接受func参数。

如果你做得对,你可以在请求周期的任何地方访问request对象。它只是有效。