前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python: 实际项目中抽象出的小项目设计Python: 一周笔记

Python: 实际项目中抽象出的小项目设计Python: 一周笔记

作者头像
谢伟
发布2018-06-06 13:30:19
7230
发布2018-06-06 13:30:19
举报
文章被收录于专栏:GopherCoderGopherCoderGopherCoder

题图.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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.08.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python: 一周笔记
    • 1. Restful API 设计
      • 2. 数据库设计
        • 3. 开发
          • 4. 工具
            • 5. 结果展示
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档