Python 如何为整个tornado web应用程序建立一个到SQLite db的连接?
现在,每次编辑用户名时,我都要创建到SQLite db的新连接。我应该如何为整个应用程序建立一个连接Python 如何为整个tornado web应用程序建立一个到SQLite db的连接?,python,database,sqlite,database-connection,tornado,Python,Database,Sqlite,Database Connection,Tornado,现在,每次编辑用户名时,我都要创建到SQLite 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')
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所指出的)
- 使用全局会话和函数get_session将其包装在单独的模块中(实际上与类singleton相同,但在模块范围内)
- 应用程序类中的句柄db,注入到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()
另一个选项是向应用程序设置添加连接,它将在从RequestHandler或WebSocketHandler继承的所有类中都可以访问
class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r"/", UserEditHandler)
],
settings = dict(
db_session = create_session()
)
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 = self.settings['db_session']
user_object = session.query(User).filter_by(id=user_id).first()
user_object.name = edited_name
session.commit()
if __name__ == "__main__":
app = Application()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
还要确保查看tornado演示以获取更多信息使用一个确保您不会同时从两个任务访问连接;你们会践踏对方的交易。