2015-11-13 62 views
1

我已经看到通过GET参数和硬编码参数herehere的帖子。烧瓶将POST参数传递给自定义修饰器

我想要做的是将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变量?

+0

'symbol'不在该布线后一个网址PARAM,你需要得到形式进入装饰,并检查它在那里我猜 – reptilicus

回答

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 
0

decorator接受func参数。您必须使用您的修饰器,如@symbol_valid()或使功能symbol_valid接受func参数。

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

相关问题