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

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容