Flask 将 POST 参数传递给自定义装饰器
Flask pass POST parameters to custom decorator
我看过关于传递 GET
参数和硬编码参数的帖子 here and here。
我想做的是将 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
传递参数时我实际上可以调用 @symbol_valid()
/quote_line/<symbol>
但我需要 POST
.
接下来的问题是我的装饰器如何访问 POST
ed 变量?
decorator
接受一个func
参数。您必须像 @symbol_valid()
这样使用装饰器,或者使函数 symbol_valid
接受 func
参数。
如果操作正确,您可以在请求周期内的任何地方访问 request
对象。它只是工作。
简单的解决方案。将 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
我看过关于传递 GET
参数和硬编码参数的帖子 here and here。
我想做的是将 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
传递参数时我实际上可以调用 @symbol_valid()
/quote_line/<symbol>
但我需要 POST
.
接下来的问题是我的装饰器如何访问 POST
ed 变量?
decorator
接受一个func
参数。您必须像 @symbol_valid()
这样使用装饰器,或者使函数 symbol_valid
接受 func
参数。
如果操作正确,您可以在请求周期内的任何地方访问 request
对象。它只是工作。
简单的解决方案。将 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