我不确定为什么跟随装饰器[validate_request]不起作用。编写这样的验证装饰器的正确方法是什么?
def validate_request(req_type):
if req_type is 'json' and not request.json:
abort(400)
def decorator(func):
@functools.wraps(func)
def wrapped_func(*args, **kwargs):
return func(*args, **kwargs)
return wrapped_func
return decorator
@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['PUT'])
@validate_request('json')
@json
def update_task(task_id):
# task = filter(lambda t: t['id'] == task_id, tasks)
task = [task for task in tasks if task['id'] == task_id]
if len(task) == 0:
abort(404)
#update task
for field in ['title', 'description', 'done']:
task[0][field] = request.json.get(field, task[0][field])
错误: -
Traceback (most recent call last):
File "C:\AGR\Programming\LearningPython\FlaskLearning\flask_rest\app.py", line 156, in <module>
@validate_request('json')
File "C:\AGR\Programming\LearningPython\FlaskLearning\flask_rest\app.py", line 144, in validate_request
if req_type is 'json' and not request.json:
File "C:\Anaconda\lib\site-packages\werkzeug\local.py", line 338, in __getattr__
return getattr(self._get_current_object(), name)
File "C:\Anaconda\lib\site-packages\werkzeug\local.py", line 297, in _get_current_object
return self.__local()
File "C:\Anaconda\lib\site-packages\flask\globals.py", line 20, in _lookup_req_object
raise RuntimeError('working outside of request context')
RuntimeError: working outside of request context
如何以更惯用的方式完成?
答案 0 :(得分:8)
这就是你的装饰者应该是什么样子
def validate_request(f):
@functools.wraps(f)
def decorated_function(*args, **kws):
# Do something with your request here
data = flask.request.get_json()
if not data:
flask.abort(404)
return f(*args, **kwargs)
return decorated_function
你会像这样称呼它
@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['PUT'])
@validate_request
def update_task(task_id):
# The rest of your code..
答案 1 :(得分:2)
这是一个过时的帖子,但我认为它可能会从一些更正中受益:
decorated_function
需要返回f(*args, **kws)
def validate_request(f):
@functools.wraps(f)
def decorated_function(*args, **kws):
# Do something with your request here
data = flask.request.get_json()
if not data:
flask.abort(404)
return f(*args, **kws)
return decorated_function
否则,您将遇到TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.