现在,每次编辑用户名时,我都会创建与 SQLite 数据库的新连接。我应该怎么做才能为整个应用程序建立单个连接?
class UserEditHandler(tornado.web.RequestHandler):
def get(self, user_id):
self.render('user_edit.html')
def post(self, user_id):
edited_name = str(self.get_arguments('name')[0])
session = create_session()
user_object = session.query(User).filter_by(id=user_id).first()
user_object.name = edited_name
session.commit()
最佳答案
有几个解决方案:
- 将其包装在一些单例类中(正如 Nikos 所说)
- 将其包装在具有全局 session 和函数 get_session 的单独模块中(实际上与单例类相同,但在模块范围内)
- 在Application类中处理数据库,注入(inject)到RequestHandler中
我推荐第三个:
import tornado
class MyApp(tornado.web.Application):
def __init__(self, *args, **kwargs):
super(MyApp, self).__init__(*args, **kwargs)
# or even initilaize connection
self._db = None
@property
def db(self):
if self._db is None:
self._db = create_session()
# additionally you can check here if session is time-outed or something
return self._db
class UserEditHandler(tornado.web.RequestHandler):
def get(self, user_id):
self.render('user_edit.html')
def post(self, user_id):
edited_name = str(self.get_arguments('name')[0])
user_object = self.application.db.query(User).filter_by(
id=user_id
).first()
user_object.name = edited_name
self.application.db.commit()
关于python - 如何为整个 Tornado Web 应用程序建立与 SQLite 数据库的一个连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34240392/