如何用请求书写Flask装饰器? [英] How to write Flask decorator with request?

查看:199
本文介绍了如何用请求书写Flask装饰器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道为什么下面的decorator [validate_request]不起作用。什么是正确的方式来写这样的验证装饰?

  def validate_request(req_type):
如果req_type是'json'而不是request.json:
abort(400)
def decorator(func):
functools.wrap(func)$ b $ def def wrapped_func(* args,** kwargs)
返回func(* args,** kwargs)
返回wrapped_func
返回装饰器

@ 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 ['id'] == task_id,tasks)
task = [任务任务如果任务['id'] == task_id]
如果len(任务) == 0:
abort(404)

#update任务
用于['title','description','done']中的字段]:
task [ 0] [field] = request.json.get(field,task [0] [field])

错误: -

  Traceback(最近一次调用的最后一个):
文件C:\AGR\Programming\LearningPython\FlaskLearning\flask_rest\app.py,第156行,放在< ;模块>
@validate_request('json')
文件C:\AGR\Programming\LearningPython\FlaskLearning\flask_rest\app.py,in line 144,in validate_request
如果req_type是'json'而不是request.json:
文件C:\Anconda\lib\site-packages\werkzeug\local.py,第338行,在__getattr__
返回getattr(self._get_current_object(),name)
在_get_current_object
中返回第297行的文件C:\Aaconda\lib\site-packages\werkzeug\local.py self .__ local()
文件C:\Anaconda\lib\site-packages\flask\globals.py,第20行,在_lookup_req_object
中引发RuntimeError('working outside of请求上下文)
RuntimeError:在请求上下文之外工作

这应该怎么做一个更习惯的方式???

解决方案

这就是你的装饰应该如何看起来像$ / b>

<$ (f):
@ functools.wrap(f)
def decorated_function(* args,** kws):
#您的请求
data = flask.request.get_json()
如果不是数据:
flask.abort(404)
return decorated_function

您可以这样称呼

  @ app.route('/ todo / api / v1.0 / tasks /< int:task_id>',methods = ['PUT'])
@validate_request
def update_task(task_id):
#其余代码..


I am not sure why following decorator[validate_request] doesn't work. What is correct way to write such validation decorator?

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])

Error :-

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

How should this be done in a more idiomatic way???

解决方案

This is how your decorator should look like

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

and you will call it like this

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

这篇关于如何用请求书写Flask装饰器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆