【问题标题】:Flask pass POST parameters to custom decoratorFlask 将 POST 参数传递给自定义装饰器
【发布时间】:2016-02-14 16:27:41
【问题描述】:

我看过关于传递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)

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

那么问题是我的装饰器如何访问POSTed 变量?

【问题讨论】:

  • symbol 不是该帖子路由中的 url 参数,您需要将表单放入装饰器并在那里检查,我猜

标签: python flask http-post


【解决方案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

【讨论】:

    【解决方案2】:

    decorator 接受 func 参数。您必须使用像 @symbol_valid() 这样的装饰器,或者让函数 symbol_valid 接受 func 参数。

    如果操作正确,您可以在请求周期的任何地方访问request 对象。它只是工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-17
      • 2017-12-13
      • 2021-11-21
      • 2018-08-24
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      相关资源
      最近更新 更多