美文网首页Python 上手指南程序员
Python: 实际项目中抽象出的小项目设计

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

作者: 谢小路 | 来源:发表于2017-08-19 23:00 被阅读136次
    题图.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 示例图:

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

    school_post.png

    code:

    code

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

    • unittest
    • mock
    • tox
    • coverage
    • nose

    相关文章

      网友评论

        本文标题:Python: 实际项目中抽象出的小项目设计

        本文链接:https://www.haomeiwen.com/subject/bnsxdxtx.html