【发布时间】: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