简体   繁体   English

如何为整个龙卷风Web应用程序建立到SQLite数据库的一个连接?

[英]How to make one connection to SQLite db for whole tornado web application?

Now I am creating new connection to SQLite db each time I edit username. 现在,每次编辑用户名时,我都在创建与SQLite db的新连接。 What should I do to make a single connection for a whole application? 如何为整个应用程序建立单个连接?

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()

There are couple solutions: 有几种解决方案:

  • wrap it in some singleton class (as Nikos noted) 将其包装在某些单例课程中(如Nikos所述)
  • wrap it in separate module with global session and function get_session (effectively the same as class singleton, but in module scope) 使用全局会话和函数get_session将其包装在单独的模块中(与类singleton有效地相同,但在模块范围内)
  • handle db in Application class, that is injected in RequestHandler 处理Application类中的db,该类已注入RequestHandler中

I would recommend third one: 我会推荐第三个:

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()

One another option is to add a connection to your app settings, it will be accessible in all classes inherited form RequestHandler or WebSocketHandler. 另一种选择是将连接添加到您的应用设置,它将在继承自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()

Also make sure to check out tornado demos for more insights https://github.com/tornadoweb/tornado/tree/master/demos 还要确保查看龙卷风演示以获得更多见解https://github.com/tornadoweb/tornado/tree/master/demos

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM