基于Flask的RESTful服务器框架

代码库地址

https://code.aliyun.com/daimingzhuang/flask-restful.git

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.
├── README.md # 说明文件
├── config.yml # 全局配置文件
├── foo.db # 测试用的SQLite数据库,可以删掉
├── resources # RESTful资源目录
│ ├── BaseResource.py # 定义了几个资源的基类,通用的CRUD接口,并实现了列表的条件查询、排序和分页。
│ ├── IndexResource.py # 示例主页,可以删掉
│ ├── TokenResource.py # Token示例,用来查询登录(GET)、登录(POST)、登出(DELETE),可根据实际情况改写
│ ├── UserResource.py # 用户资源示例
│ └── __init__.py # 统一绑定资源到URI
├── rest_server.py # 服务器主程序
└── utils
├── __init__.py
├── common.py # 定义了一些通用的工具
├── config.py # 读取全局配置文件
├── db.py # 数据库模型定义、关系映射等
├── db_base.py # SQLAlchemy ORM 框架基类
├── logger.py # 日志
├── mutex.py # 基于Redis的跨进程锁,实现了互斥锁和读写锁
├── redis_pool.py # Redis连接池
└── redis_session.py # 基于Redis的HttpSession

环境依赖

python3

pip3 install -r requirements.txt

1
2
3
4
5
flask
flask-restful
sqlalchemy
redis
pyyaml

开发指南

根据项目情况配置 config.yml

修改 utils/db.py ,对数据模型(即数据库的表)进行定义。

resources 下新建资源,继承 BaseResource 中的某个基类,有需要时可重写get/post/put/delete方法实现自定义的业务逻辑。

resources/__init__.py 中添加资源的URI映射。

utils文件夹除了db.py,其他代码通用性都比较强,一般都只需使用无需修改。

resources文件夹除了BaseResource.py,其他代码可以认为都是示例,应该根据需要修改和删除。

httpsession存储在redis服务器中,前端的登录标识通过登录返回的header中的token字段和数据的{“data”: {“token”: “xxx”}}同时返回,前端后续的请求应该在header携带token字段(或token参数)以表明身份,具体可以看后面的请求示例

启动方式

开发环境

1
python3 reset_server.py

Linux上的生产环境

1
gunicorn -b 0.0.0.0:8088 rest_server:app

请求示例

查询当前登录状态

1
GET http://localhost:8088/Token

response text

1
2
3
4
5
{
"result_code": "fail",
"err_code": "LOGIN_FAILED",
"err_code_des": "用户未登录"
}

登录

1
2
POST http://localhost:8088/Token
body {"username":"admin", "password":"123456"}

response text

1
2
3
4
5
6
7
8
9
10
11
{
"result_code": "success",
"data": {
"token": "66007530da1e424ba35006afad746fa9",
"user": {
"id": 1,
"username": "admin",
},
"create_time": 1651989903.466016
}
}

查看登录后的测试主页

1
2
GET http://localhost:8088/
header token: 66007530da1e424ba35006afad746fa9

response text

1
"Hello, admin."

查询列表指定条件、分页、排序

1
2
http://localhost:8088/Users?page=1&page_size=15&sort=username&order=asc&username_like=a%n
header token: 66007530da1e424ba35006afad746fa9

response text

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"result_code": "success",
"data": [
{
"id": 1,
"username": "admin"
}
],
"total": 1,
"page": 1,
"page_size": 15,
"page_num": 1
}

更多的查询条件使用方法,可以阅读 resources/BaseResource.pyROPluralResource 类的 get 方法的源码