前阶段上级给了任务,让我做一个后端能抗得住高并发的,我一想,抗高并发不就是扩展集群负载均衡等等等...
但是上级不是这么个要求,他说:你用Tornado,对于我这学了两三年Java的小菜鸡,自然不知道Tornado是啥(因为平时不是闲着蛋疼啥都了解),所以我就问了度娘,哟西是Python的框架,采用异步非阻塞的IO,支持WebSocket和安全性功能,适合实时通信和大规模请求处理.....然后我就边看文档边上手了。
大家都知道Java的层级结构是很分明的,所以我刚上手Tornado还很不习惯,这玩意儿怎么跟隔壁node.js一样从一个app开始哇!脚手架呢?!没有??所以就写的贼难受
首先来一个app.py,当然这边的路由最好也封装一下,我太懒了......
from tornado import web, ioloop
from Handler.UserHandler import queryAll
def make_app():
return web.Application([
(r"/", queryAll)
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
ioloop.IOLoop.current().start()
然后就是配置层(config),我写了个数据库的信息和连接:
db_config = {
'host': "localhost",
'port': 3306,
'username': "root",
'password': "root",
'database': "user_db"
}
from sqlalchemy.ext.asyncio import create_async_engine
from Config.db import db_config# 导入配置
engine = create_async_engine(
f"mysql+aiomysql://{db_config.get('username')}:{db_config.get('password')}@{db_config.get('host')}:{db_config.get('port')}/{db_config.get('database')}"
)
这段代码使用sqlalchemy.ext.asyncio
模块创建了一个异步的MySQL数据库引擎。在引擎的配置中,使用了一个名为db_config
的字典对象,该对象包含了数据库的相关配置信息,比如用户名、密码、主机、端口和数据库名等。
调用create_async_engine()
函数创建异步引擎对象,传入了MySQL连接字符串作为参数。连接字符串使用了f-string的语法,将db_config
中的配置信息动态地拼接到连接字符串中。
engine
变量将持有创建的异步引擎对象,可以进一步使用它来进行数据库操作。这个异步引擎可以与Tornado等异步框架搭配使用,以实现高性能、非阻塞的数据库访问。
然后就是之前被跨域坑惨过,所以我现在都习惯性先写跨域配置类,这边也给正在初学的你们一个示例代码,具体需要再根据个人修改哈~
from tornado import web
# 跨域配置类
class CorsHandler(web.RequestHandler):
def set_default_headers(self):
self.set_header("Access-Control-Allow-Origin", "http://localhost:8888/") # 跨域的域名或者ip
self.set_header("Access-Control-Allow-Credentials", "true")
self.set_header("Access-Control-Allow-Headers", "Authorization")
self.set_header('Access-Control-Allow-Methods', 'POST, GET, PATCH, PUT, DELETE, JSONP, OPTIONS')
self.set_header("Access-Control-Max-Age", 1000)
self.set_header("Content-type", "application/json")
def option(self):
self.set_status(200)
self.finish()
然后就是定义数据模型啦,新建一个model文件夹作为模型层,然后根据表结构(我的表只有id,username,password)所以就比较简单:
from sqlalchemy import Column, Integer, String, select, insert, update, delete
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
user_id = Column(Integer, primary_key=True)
username = Column(String(255))
password = Column(String(255))
@classmethod
def select(cls):
return select(cls)
@classmethod
def insert(cls):
return insert(cls)
@classmethod
def update(cls):
return update(cls)
@classmethod
def delete(cls):
return delete(cls)
这段代码使用了SQLAlchemy库来定义一个名为User
的ORM(对象关系映射)模型类,并定义了常用的数据库操作方法。
首先,通过导入相关模块和函数,创建了Column
、Integer
、String
等列类型,并调用declarative_base()
函数创建了一个名为Base
的基类。
然后,定义了User
类,它继承自Base
类。在User
类中,使用__tablename__
属性指定了数据库中对应的表名为"user"。接着,定义了三个字段:user_id
、username
和password
,分别表示用户ID、用户名和密码。
接下来,使用@classmethod
装饰器定义了四个类方法,分别是select()
、insert()
、update()
和delete()
。这些方法返回的是相应的SQLAlchemy查询对象,可以用于执行对应的数据库操作。例如,User.select()
返回一个select
查询对象,可以用于查询User
表中的数据。
这样,通过定义这个User
类以及相应的查询方法,可以方便地进行数据库操作,例如查询用户数据、插入新的用户、更新用户信息和删除用户等操作。
模型层定义好后我们接着写接口,前面app.py里面的路由是为了看这篇文章的小伙伴方便复制,不然写接口的时候还是要先写接口再写路由哦,这是好习惯~
这里定义一个handler层作为控制层,然后把写一个UserHandler.py写用户表相应的接口:
import json
from Handler.CorsHandler import CorsHandler
from Config.conn import engine
from Model.User import User
from sqlalchemy.ext.asyncio import AsyncSession
class queryAll(CorsHandler): # 获取用户列表
async def get(self):
# 创建异步会话
async with engine.begin() as conn:
# 执行查询
result = await conn.execute(User.select())
users = result.all()
# 将查询结果转为字典列表
user_list = []
for user in users:
user_info = {'user_id': user.user_id, 'username': user.username, 'password': user.password}
user_list.append(user_info)
# 转换成json格式响应输出
self.write(json.dumps(user_list))
然后运行python3 app.py ,访问 http://localhost:8888/ 就能看到数据库的用户列表咯!如果运行不起来的小伙伴看看有没有安装对应的依赖这些的:
pip3 install tornado
pip3 install sqlalchemy
pip3 install aiomysql