关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

在flask里面和数据库交互:

使用orm对数据库进行操纵(orm的底层还是pymysql)

orm: object relational mapping(对象关系映射)

flask不需要和复杂的sql语句打交道 只需要操控orm对象就可以了

orm就是用来将数据库里的表结构映射成模型类

类产生的对象就是数据库里的每一行记录

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

配置文件setting里面添加数据库配置:

第一行:连接数据库

SQLALCHEMY_DATABASE_URI =用户名:密码@数据库主机/数据库?字符集

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

之后再model文件夹下面新建一个__init__.py

创建一个db对象 还要将db和app做绑定  并且把表也导入运行

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

相关的user.py

相当于新建一张user表 而设定的字段如果指定为String类型 则需要指定长度

User里面的每隔class都是一个模型 它都要继承db.Model类

一个类会映射成数据库的一个表

类会实例化 而实例化的每个对象 就是表里面的一行记录

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

user.py里面: 新增用户

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

然后把蓝图绑定到app上面

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

用动态url实现删除

User.query.get()使用get查找,只针对主键 get的时候只能get到第一个 所以只能单条操作

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

改:还是一样只能修改一条

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

查:

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

在浏览器输入url请求会发生什么?

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

客户端发起请求

服务器收到请求    解析http包头(包头部字段有url和请求方法)   拿到body数据

通过url和请求方法来进行判断处理

  1. 通过url来在url_map表里找到对应的endpoint

view_function表里找到对应的视图函数

  1. 判断请求方法是否正确

调用相应的视图函数做处理

可通过request对象对传入的参数进行获取

也可以通过动态url进行参数获取

如果有数据库的操作 就导入相应的模型类

这里通过操控orm对象来操控数据库,实现数据库的增删改查

对于查询操作,数据库的对象不能直接返回,需要对它进行序列化

需要相应的格式转化,建议使用json

返回相应api数据

关于序列化操作可以直接放在user.py的类里面

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

于是这边就不需要我们手动返回了

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

将单个查询和全部查询放在一个函数里

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

操纵数据库的时候一定要记得提交

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

项目需要统一返回标准化:

返回成json格式     

需要返回状态码(status):定义程序的逻辑状态

还有message 解释状态码的意思

data 请求返回的数据 数据全部放在data里面

一般格式:{“status”:10000,“message”:“数据请求成功!”,“data”:[]}

于是把这个作为一个公共的设定 定义一个新的文件夹libs(存放公共函数)

然后创建一个utils(里面存放所有的工具)

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

这样就可以达到标准化 规范化

启动项目:

  1. 立项  成立项目组 做好职责划分
  2. 需求收集  需求分析
  3. 设计这个项目 产品原型图  数据库设计,接口设计(url 传参)
  4. 写代码
  5. 测试上线

Flask提供接口 可以添加监控项 也可以展示监控项

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

因为我们现在没有前端 所以我们后面的展示操作等 都只能通过接口完成

对于普通用户而言,自己添加的监控项只有自己能看

对于管理员来看,所有的监控下都能看

对于项目user时 用户密码建议哈希存入  角色的话建议设置成枚举型

monitor里面存放的是监控表

表与表之间建立关系 (一定要设置外键)

在model的user.py里面跟monitor表创建连接

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

在命令行里面 帮助管理flask的工具:flask-scrip

安装好了之后 我们舍弃server.py 新建了一个manage.py

现在我们的主程序 核心对象 都交给了manage.py 了

现在python manage.py就相当于一个命令了 还可以接参数 不过也是默认启动了

所以我们需要用命令行去指定端口 路径等

命令行启动程序:python manage.py runserver -h 192.168.0.25 -p 8000

python manage.py有三个参数

db

runserver:启动

shell:运行一个python的shell程序

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

相当于进入app的内部

在这里操控的一切东西都是操控app

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

这样是的对象里面多了一个monitor属性  monitor属性里面就包含了user的id(因为id被设置成了外键)相同的监控项(也就是monitor表里的数据)

用户通过monitor属性来找到监控

monitor表又添加了反向查询user  moniter的对象可以通过user属性来找到用户

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

这个关系不是数据库的 是orm的  就不用再连表查询了

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

把api更加规范化:flask-restful(是一种软件适用风格)(面试常考)

restful:

#REST(representational state transfer)(api的设计方式):表现层状态转移

这不是必须的 它只是一种通用的软件设计风格

通俗来讲就是 资源在网络中以某种表现形式进行状态转移

resource:资源  也就是数据  如用户数据就是一类资源 监控数据是一类资源

representational:某种表现形式 如JSON,html

state tranfer:状态转移。通过http方法实现(其实就相当于对用户进行增删改查 要用http的动词实现 这是rest的使用规则)

如 没有使用rest :                     使用了rest那么url就只有两个或一个了

(不同方法做不同的事情)

       /user就是一类资源                        /user       /user/id

       /user/add                                      post方法

       /user/delete                                  delete方法

       /user/update                                 update方法

       /user/get                                      get方法

按照资源来划分url,没有必要根据动作再来划分了

每一类资源给一个或两个url     通过http的不同方法来实现对这类资源的增删改查

符合rest原则的架构 我们称之为restful架构

这个还携带版本号 规定了api应该怎么设计 规定了相应格式 规定了状态码等等

每一个url就代表一种资源

客户端通过四个http方法对服务器资源进行操作

比如 对于用户这一类资源(id是user的数据库存储的id)

GET  /v1/user   获取所有用户

GET  /v1/user/id 获取某个用户(v1是版本号  2代表id)

POST /v1/user  新增用户

PUT /v1/user/id  新增用户

DELETE  /v1/user/id 删除用户

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

现在可以通过server.py去运行 也可以通过命令行去运行

对于python调用Linux命令    推荐使用subprocess

查询是最容易考的!!!!!

按条件查询:

精确查询filter_by    模糊查询filter

Filter_by没有filter灵活

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

多条件:

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

排序:

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

限制:

关于日志流量监控预警小小项目 | 在flask里面和数据库交互 标准化返回

查询小结:

查询小总结:

1.User.query.all() 所有

2.User.query.get(pk) 一个

3.User.query.filter()

如果要检索的字段是字符串(varchar,db.String)

User.username.startwith('')

User.username.endwitd('')

User.username.contains('')

User.username.like('') 传入的参数需要加%

User.username.in_(['','','',''])

User.username==

如果要检索的字段是整型或日期类型:

User.age.__lt__(18) 双下划线

User.rdatetime.__gt__('.....')

User.age.__le__(18)

User.age.__ge__(18)

User.age.between(18,25)

多个条件一起检索:and_ or_

非得条件:or_

排序:order_by()

获取指定数量:limit() offset()

4.User.query.filter_by(username='xxx') User.query.filter(username== 'xxx')

删除

两种删除:

1.逻辑删除,其实就是更新(定义数据库中的表的时候,添加一个字段名为isdelete,通过此字段控制是否删除)

id=request.args.get(id) 用于接收get请求中的参数

user=User.query.get(id)

user.isdelete=True

db.session.commit()

2.物理删除(彻底从数据库中删除)

id=request.args.get(id) 用于接收get请求中的参数,若为post就把args替换成form

user=User.query.get(id)

db.session.delete(user)

db.session.commit()

3.更新

id=request.args.get(id)

user=User.query.get(id)

#修改对象的属性

user.username=xxx

user.phone=xxx

#提交修改

db.session.commit()

需要提交:

添加

user=User()

user.xxx=xxx

db.session.add(user)

db.session.commit()

删除

user=User.query.get(id)

db.session.delete(user)

db.session.commit()

更新

user=User.query.get(id) #获取数据库中的对象

#修改对象的属性

user.username=xxx

user.phone=xxx

#提交修改

db.session.commit()

标准化返回:

我们项目一般都会准备一个说明文档(就可以直接把项目文档提取一部分放入说明文档就好),整理说明文档很重要(说明文档就是给别人用的)

请求参数就是url传值问号后面传入的变量

返回的参数也就是说明我们返回什么内容

网络上传输一般是使用字符串形式 而json格式就是很轻易的把字符串格式和所需对象进行转换  规范是约定俗成返回json格式

http的状态码只关注这次请求是否成功连接得到数据 而不关注得到的数据是否是我们需要的 于是我们每个应用程序都会拥有自己的状态码

(然后可以通过描述信息message去看我们是哪种类型的失败)

上一篇:ApacheCN 翻译活动进度公告 2019.4.23


下一篇:ApacheCN 数据库译文集 20211112 更新