【问题标题】:flask route decorator RuntimeError [duplicate]烧瓶路线装饰器 RuntimeError [重复]
【发布时间】:2016-03-11 20:58:52
【问题描述】:

我编写了一个简单的烧瓶应用程序,它为用户返回指定的 id。我想让每条路线都使用相同的逻辑,所以我想把它作为一个装饰器来实现。

# the decorator
def session_decorator(data_handle_func):
     session_id = request.cookies.get('static')
    if session_id is None:
        session_id = uuid.uuid1().hex
    resp = make_response(data_handle_func(session_id))
    resp.set_cookie('static', session_id)
    return resp

# version 1
@app.route("/session")
def sessionx():
    def simple(session_id):
         return session_id
    return session_decorator(simple)

# version 2, throw excetion 
@app.route("/session2")
@session_decorator
def sessionx(session_id):
    return session_id

第一个版本运行良好。第二个是期望的版本,它抛出:

Traceback (most recent call last):
  File "app.py", line 466, in <module>
    @session_decorator
  File "app.py", line 451, in session_decorator
    session_id = request.cookies.get('static')
  File "/home/users/install/python/lib/python2.7/site-packages/Werkzeug-0.11-py2.7.egg/werkzeug/local.py", line 342, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/home/users/install/python/lib/python2.7/site-packages/Werkzeug-0.11-py2.7.egg/werkzeug/local.py", line 301, in _get_current_object
    return self.__local()
  File "/home/users/install/python/lib/python2.7/site-packages/Flask-0.10.1-py2.7.egg/flask/globals.py", line 20, in _lookup_req_object
    raise RuntimeError('working outside of request context')
RuntimeError: working outside of request context

更新

根据这个related question,我写了下面的装饰器,它可以工作。但我不知道为什么会这样,实际上是什么导致了 RuntimeError ?有人可以对此提出一些建议吗?

def session_decorator_v2(data_handle_func):
    @functools.wraps(data_handle_func)
    def decorated_function(*args, **kws):
        session_id = request.cookies.get('static')
        if session_id is None:
            print "not exist"
            session_id = uuid.uuid1().hex
        resp = make_response(data_handle_func(session_id))
        resp.set_cookie('static', session_id)
        return resp
    return decorated_function

【问题讨论】:

  • @KevinGuan 我的问题不在于UT。 @rmn 我会试试,一旦成功,我会关闭这个问题。
  • 啊,很公平。撤回了我的投票。

标签: python python-2.7 flask decorator python-decorators


【解决方案1】:

您的装饰器定义错误。必须是返回函数的函数,该函数将被执行并调用data_handle_func

# the decorator
def session_decorator(data_handle_func):
    def session_parser():
        session_id = request.cookies.get('static')
        if session_id is None:
            session_id = uuid.uuid1().hex
        resp = make_response(data_handle_func(session_id))
        resp.set_cookie('static', session_id)
        return resp
    return session_parser

# version 2, throw excetion 
@app.route("/session2")
@session_decorator
def sessionx(session_id):
    return session_id

您看到此错误的原因是您的“装饰器”在附加到路由后立即执行。当你这样做时request.cookies.get('static') Flask 正在哭泣,因为它还没有请求上下文(你正在初始化应用程序,而不是处理请求)

编辑 OP 的更新: 你提供的代码和我给你的一模一样。

@functools.wraps(data_handle_func)

是一个装饰器,它将函数名称和描述放到被包装的函数中。所以装饰器在使用时不会更改丢失描述的名称。

装饰器基本上只是一个函数,当应用于函数时将返回一个函数......

【讨论】:

  • 非常感谢。你的意思是在初始化应用程序时执行了错误的装饰器,应该在处理请求时执行。这会导致错误吗?
  • 是的,装饰器只返回一个函数,它将替换你正在装饰的那个。装饰器执行一次,但每次访问装饰器时都会执行内部函数。
  • RuntimeError working outside of request context是否表示上下文不存在,只有在处理上下文时才会出现?
猜你喜欢
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2021-04-06
  • 2020-09-20
相关资源
最近更新 更多