Osheep

时光不回头,当下最重要。

Python: 实际项目中抽象出的小项目设计

《Python: 实际项目中抽象出的小项目设计》

题图.png

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 示例图:

《Python: 实际项目中抽象出的小项目设计》

postman.png

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 表中插入这条数据,并把插入的数据信息展示出来。

《Python: 实际项目中抽象出的小项目设计》

school_post.png

code:

code

下一篇根据这个项目进行讲解如何进行测试:并讲解python 测试。

  • unittest
  • mock
  • tox
  • coverage
  • nose
点赞