gpt4 book ai didi

python - 提取涉及 tornado.gen.Task 的异步代码

转载 作者:可可西里 更新时间:2023-11-01 09:21:02 27 4
gpt4 key购买 nike

我有许多 tornado.web.RequestHandler 类,它们使用 ID 和访问 key 安全 cookie 测试授权访问。我使用 gen.Task 通过内联回调异步访问 mongodb。由于其异步性,我无法找到一种方法来分解重复代码。我该怎么做?

class MyHandler(RequestHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
id = self.get_secure_cookie('id', None)
accesskey = self.get_secure_cookie('accesskey', None)
if not id or not accesskey:
self.redirect('/a_public_area')
return
try:
# convert to bson id format to access mongodb
bson.objectid.ObjectId(id)
except:
# if not valid object id
self.redirect('/a_public_area')
return
found_id, error = yield gen.Task(asyncmong_client_inst.collection.find_one,
{'_id': id, 'accesskey': accesskey}, fields={'_id': 1})
if error['error']:
raise HTTPError(500)
return
if not found_id[0]:
self.redirect('/a_public_area')
return

# real business code follows

我想将上述因素纳入一个可能产生 HTTP 状态代码的函数中。

最佳答案

Tornado 有装饰器@tornado.web.authenticated。让我们使用它。

class BaseHandler(RequestHandler):
def get_login_url(self):
return u"/a_public_area"

@gen.engine #Not sure about this step
def get_current_user(self):
id = self.get_secure_cookie('id', None)
accesskey = self.get_secure_cookie('accesskey', None)
if not id or not accesskey:
return False

#Are you sure need this?
try:
# convert to bson id format to access mongodb
bson.objectid.ObjectId(id)
except:
# if not valid object id
return False

#I believe that you don't need asynchronous mongo on auth query, so if it's not working - replace it with sync call
found_id, error = yield gen.Task(asyncmong_client_inst.collection.find_one,
{'_id': id, 'accesskey': accesskey}, fields={'_id': 1})

if error['error']:
raise HTTPError(500)

if not found_id[0]:
return False

return found_id


class MyHandler(BaseHandler):
@tornado.web.asynchronous
@tornado.web.authenticated
@gen.engine
def get(self):
# real business code follows

到处使用 gen - 不是很好的做法。它可以把这个世界变成大意大利面。想想看。

关于python - 提取涉及 tornado.gen.Task 的异步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11663131/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com