Python 如何为整个tornado web应用程序建立一个到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')

现在,每次编辑用户名时,我都要创建到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')[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演示以获取更多信息

使用一个确保您不会同时从两个任务访问连接;你们会践踏对方的交易。