tornado如何通过Application传参数给handler?

本文介绍了在Tornado Web服务器中如何有效地管理和使用数据库连接。通过创建一个数据库连接类,实现非阻塞式的数据库操作,避免频繁新建连接导致的资源浪费。每个handler只需移动cursor即可完成数据库交互,提高了效率并降低了内存消耗。示例代码展示了如何在main入口创建数据库连接实例,并在handler中传递使用。
摘要由CSDN通过智能技术生成


tornado

Tornado是一种 Web 服务器软件的开源版本。Tornado 和主流Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。 得利于其非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。

一、一个想法

在使用tornado的时候,我通过不同的事务也就是handler来区分不同的功能模块,再处理handler的时候需要对其进行数据库操作,本人的数据库划分的比较魔性,比如用户信息,用户货币两个为两个单独的数据库,而非一个user数据库的不同表单,咳咳,不要在意为什么要这样做,只需要考虑目前在特定的一些模块进行数据库pymysql操作怎么做比较好?
需求就是:如何在多个handler里与数据库反复的互动。
首先:我们不可能去new一堆的数据库连接,这样会导致啥,开动小脑袋想想也知道,导致数据累,导致内存涨。
最后:【嗯,没有中间商】我们需要一个数据库的连接(对应不同数据库表),每次只需要对其移动cursor即可。

二、只需要一个动作

1.建立数据库class

代码如下(示例):

class ConnectDB:
    def __init__(self,conf):
        if type(conf) is not dict:
            print("传入参数错误")
        else:
            if 'host' not in conf.keys():
                conf['host'] = '127.0.0.1'
            if 'port' not in conf.keys():
                conf['port'] = 3306
            if 'user' not in conf.keys():
                conf['user'] = '1111'
            if 'pwd' not in conf.keys():
                conf['pwd'] = '666666'

            for key in ['host','port','user','pwd','db']:
                if key not in conf.keys():
                    print("miss key %s",key)

            if 'charset' not in conf.keys():
                conf['charset'] = 'utf8'
        self.db = conf['db']
        try:
            self._conn = pymysql.connect(
                host=conf['host'],
                port=conf['port'],
                user=conf['user'],
                passwd=conf['pwd'],
                db=self.db,
                charset=conf['charset'],
                cursorclass=pymysql.cursors.DictCursor
            )
            self.connected = True
        except pymysql.Error as e:
            print("connect %s err" % conf['db'])

    # 需要插入的表,以及参数
    # sql:语句
    # vals:键值匹配的值
    # 防止注入,则分开传值
    def insert(self,sql,vals):
        print("insert sql: %s " % sql ,vals)
        try:
            # 防止注入
            with self._conn.cursor() as cur:
                cur.execute(sql,vals)

            self._conn.commit()
            return self._conn.insert_id()
        except pymysql.Error as e:
            print("insert err ",e)
            self._conn.rollback()
            return False

嗯,剩下的方法自行扩展了。

2.main入口new出来

产生单一使用示例(示例):

mysql_account = MYSQLTool.ConnectDB(dict(db='accounts'))
mysql_wealth = MYSQLTool.ConnectDB(dict(db='wealth'))

然后继续在Application进行参数传递。

app = tornado.web.Application([
        (r"/", IndexHandler),
    	(r"/login",handler.LoginHandler.Handler,dict(mysql_account=mysql_account,mysql_wealth=mysql_wealth)),
    ])

    http_server = tornado.httpserver.HTTPServer(app)
    ....

最后在handler里调用即可


class Handler(tornado.web.RequestHandler):
    def initialize(self, mysql_account,mysql_wealth):
        self.mysql_account = mysql_account
        self.mysql_wealth = mysql_wealth

    def get(self):
    ....
    // 此处收到客户端请求,自己可以使用mysql来进行操作即可

总结

就这样子就可以实现我们需要对应每一个handler处理的时候的参数传递,达到了人码合一的境界。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

big pineapple

谢谢你的小助力,时间就是金钱。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值