2015-11-13 106 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對象。它只是工作。

相關問題