当前位置: 首页 > 面试题库 >

如何用请求编写Flask装饰器?

弓俊晖
2023-03-14
问题内容

我不确定为什么跟随decorator [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

应该如何以一种更加惯用的方式完成???


问题答案:

这是你的装饰器的外观

def validate_request(f):
  @functools.wraps(f)
  def decorated_function(*args, **kwargs):
    # 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..


 类似资料:
  • 问题内容: 问题 我希望某些观点仅适用于网站的高级用户。 在项目中的各种应用程序中如何使用此装饰器? 问题答案: 你不必为此编写自己的装饰器,就像中已经包含的那样。 还有一个扩展此装饰器的代码段(),该代码段非常适合你的用例。 而且,要(重新)使用装饰器,只需将装饰器放在路径中的模块中,即可从任何其他模块导入它。

  • 我需要帮助如何在我的服务器(index.js)中正确编写GET和POST请求,以及如何在应用程序中正确编写fetch。js。 我阅读了Stackoverflow上的线程,并搜索了有关如何编写请求和获取的信息,但我发现如何将示例添加到自己的代码中非常困难。我已经尝试了三个星期不同的解决方案,但都一事无成。所以,请帮忙。我觉得这应该没那么难,但出于某种原因确实如此。除了这里,我没有人需要帮助。 我正在

  • 我是新到Groovy wslite,我想写一个肥皂请求在wslite。 我在xml中的肥皂请求是- 我正在运行的groovy脚本如下- 当我执行我的时髦时,出现错误 我做错了什么。 PS:SoapAction在我使用的wsdl中为“”

  • 问题内容: 如何编写一个装饰器,将当前工作目录还原到调用装饰函数之前的目录?换句话说,如果在执行an的函数上使用装饰器,则调用该函数后cwd将不会更改。 问题答案: path.py模块(如果在python脚本中处理路径,则应使用该模块)具有上下文管理器: (版权来自Roberto Alsina的这篇博客文章)

  • 问题内容: 考虑这个小例子: 哪个打印 为什么参数(应该是Test obj实例)没有作为第一个参数传递给装饰函数? 如果我手动进行操作,例如: 它按预期工作。但是,如果我必须事先知道某个函数是否装饰,它就破坏了装饰器的全部目的。这里的模式是什么,还是我误会了什么? 问题答案: tl; dr 您可以通过将类作为描述符并返回部分应用的函数来解决此问题,该函数从中应用对象作为参数之一,如下所示 实际问题

  • 问题内容: 我想用XML内容类型编写请求的正文,但是我不知道如何使用HttpClient对象(http://hc.apache.org/httpclient-3.x/apidocs/index.html) 而且我不知道如何继续用我的XML编写正文… 问题答案: 如果您的xml是由您编写的,则只能以这种方式使用 注意例外。 顺便说一句,该示例是由httpclient版本4.x编写的