【问题标题】:How to make one connection to SQLite db for whole tornado web application?如何为整个 Tornado Web 应用程序建立一个与 SQLite db 的连接?
【发布时间】:2015-12-12 13:31:37
【问题描述】:

现在我每次编辑用户名时都会创建到 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()

【问题讨论】:

  • 确保不要同时从两个任务同时访问连接;你们会阻碍彼此的交易。

标签: python database sqlite database-connection tornado


【解决方案1】:

有几种解决方案:

  • 将其包装在某个单例类中(如 Nikos 所述)
  • 使用全局会话和函数 get_session 将其包装在单独的模块中(实际上与类单例相同,但在模块范围内)
  • 在Application类中处理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()

【讨论】:

    【解决方案2】:

    另一种选择是向您的应用设置添加一个连接,它可以在继承自 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()
    

    还请务必查看龙卷风演示以获取更多见解https://github.com/tornadoweb/tornado/tree/master/demos

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 2019-09-03
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多