¿Cómo escribir decorador matraz con petición?

No estoy seguro de por qué el siguiente decorador [validate_request] no funciona. ¿Cuál es la forma correcta de escribir dicho decorador de validación?

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/', 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]) 

Error: –

 Traceback (most recent call last): File "C:\AGR\Programming\LearningPython\FlaskLearning\flask_rest\app.py", line 156, in  @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 

¿Cómo debería hacerse esto de una manera más idiomática?

Así es como debe verse tu decorador

 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 decorated_function 

y lo llamarás así

 @app.route('/todo/api/v1.0/tasks/', methods=['PUT']) @validate_request def update_task(task_id): # The rest of your code.. 

Es una especie de publicación antigua, pero creo que podría beneficiarse con una pequeña corrección: la función decorated_function necesita devolver 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 

De lo contrario, se encontrará con TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement. TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.