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来进行操作即可