Python: 一周笔记
本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」。
这个系统主要完成下面增删改查的功能:
包括:
- 学校信息的管理
- 教师信息的管理
- 学生信息的管理
根据Api请求的动作:
- POST: 增加信息
- GET: 查询信息
- PUT: 更新信息
- DELETE: 删除信息
可以以下面一个简单的实例看这个系统完成什么样的工作:
from flask import Flask
app = Flask(__name__)
@app.route('/api.example.com', methods=['POST'])
def hello():
return make_response(jsonify(resource=request.json), 200)
if __name__ == "__main__":
app.run()
发送curl 命令:
curl -i http://127.0.0.1:5000/api.example.com -H "Content-Type: application/json" -d '{"usage": "for example", "method": "post", "author": "xiewei"}'
返回结果:
{
"resource": {
"author": "xiewei",
"method": "post",
"usage": "for example"
}
}
其他的动作类似的发送api 请求,完成相应的动作,真实的项目往往后加上数据库的操作。
整个流程主要包括:
- restful api 设计
- 数据表设计
- 开发:目录的结构、一致性
- 结果展示
1. Restful API 设计
主要包括URL 设计和 状态码的设计:
CODE | DES |
---|---|
200 | 成功 |
404 | 错误信息 |
500 | 服务器错误信息 |
POST:
Method | URL | Content-Type | Des |
---|---|---|---|
POST | /api.<res>.example.com/<ver>/creation | application/json | create info |
school_post: "/api.school.example.com/v1/creation"
teacher_post: "/api.teacher.example.com/v1/creation"
student_post: "/api.student.example.com/v1/creation"
GET:
Method | URL | Content-Type | Des |
---|---|---|---|
GET | /api.<res>.example.com/<ver>/<name> | application/json | get info |
school_get: "/api.school.example.com/v1/name"
teacher_get: "/api.teacher.example.com/v1/name"
student_get: "/api.student.example.com/v1/name"
PUT:
Method | URL | Content-Type | Des |
---|---|---|---|
PUT | /api.<res>.example.com/<ver>/<name> | application/json | update info |
school_put: "/api.school.example.com/v1/name"
teacher_put: "/api.teacher.example.com/v1/name"
student_put: "/api.student.example.com/v1/name"
DELETE:
Method | URL | Content-Type | Des |
---|---|---|---|
DELETE | /api.<res>.example.com/<ver>/<name> | application/json | delete info |
school_delete: "/api.school.example.com/v1/name"
teacher_delete: "/api.teacher.example.com/v1/name"
student_delete: "/api.student.example.com/v1/name"
2. 数据库设计
主要包括:表设计,字段类型等的设计,鉴于篇幅有限只展示School 表:
School:
Field | Type | NULL | Key | Default | Extra | Des |
---|---|---|---|---|---|---|
id | Integer | Fasle | PRI | NULL | auto_inc | id |
name | string | False | NULL | info_name | ||
student_number | Integer | Flase | NULL | number of student | ||
grade | string | False | NULL | grade include | ||
teacher_number | Integer | False | NULL | number of teacher | ||
principal | string | False | NULL | name of principal | ||
vice_principal | string | False | NULL | name of vice_prin | ||
vice_principal_number | Integer | False | NULL | number | ||
slogan | string | False | NULL | slogan |
3. 开发
目录结构:考虑两个因素
- 耦合性
- 扩展性
数据库操作和业务操作分开,提供接口:
├─api
│ ├─res
│ │ ├─v1
├─cmd
├─data
├─db
├─info
├─models
├─tests
│ ├─api
│ │ ├─res
│ ├─common
└─util
api:数据库API, flask_app api
cmd: 创建数据库操作
data: sqlite 数据表文件
db: 具体数据库增删改查
info: api 传递的body的具体实例
models: 数据库表结构定义
tests: 测试
util: 提供项目公共函数方法
数据库API:
主要使用sqlalchemy 的增删改查进行封装:
- add
- query
- update
- delete
以add 实例:
def add(self, dbt, **body):
try:
self.session.add(dbt(**body))
self.session.commit()
return 'OK'
except Exception as e:
self.session.rollback()
return str(e)
flask_api:
主要使用flask 定义不同动作的接口:
- POST
- GET
- DELETE
- UPDATE
以POST示例:
@app.route('/api.<res>.example.com/<ver>/creation', methods=['POST'])
def post(res, ver):
try:
body = request.json
try:
resource = get_import(res, ver)
if resource:
ack, rt = resource.post(body)
if ack == 'OK':
post_rt = make_response(jsonify(resource=rt), 200)
else:
post_rt = make_response(jsonify(error=str(rt)), 404)
return post_rt
except Exception as e:
return 'body is not valid json'
except Exception as e:
return make_response(str(e), 500)
4. 工具
restful api 发送请求命令工具:
- POSTMAN: chrome 浏览器插件
- RESTClient: 火狐浏览器插件
- 服务器端:用curl 命令吧
POSTMAN 示例图:
5. 结果展示
发送请求(api) --》 数据库增删改查(数据持久化) --》 返回Json 格式的数据和状态码(展示)
curl -i http://127.0.0.1:5000/api.school.example.com/v1/creation -H "Content-Type: application/json" -d '{"name": "xiewei22","student_number": 1982,"grade": "[G1, G2, G3]","teacher_number": 102,"principal": "xiewei2","vice_principal": "wenlimin2","vice_principal_number": 12,"slogan": "friendly2"}'
result:
{
"resource": [
{
"grade": "[G1, G2, G3]",
"id": 1,
"name": "xiewei22",
"principal": "xiewei2",
"slogan": "friendly2",
"student_number": 1982,
"teacher_number": 102,
"vice_principal": "wenlimin2",
"vice_principal_number": 12
}
]
}
数据库 school 表中插入这条数据,并把插入的数据信息展示出来。
code:
下一篇根据这个项目进行讲解如何进行测试:并讲解python 测试。
- unittest
- mock
- tox
- coverage
- nose