在flask里面和数据库交互:
使用orm对数据库进行操纵(orm的底层还是pymysql)
orm: object relational mapping(对象关系映射)
flask不需要和复杂的sql语句打交道 只需要操控orm对象就可以了
orm就是用来将数据库里的表结构映射成模型类
类产生的对象就是数据库里的每一行记录
配置文件setting里面添加数据库配置:
第一行:连接数据库
SQLALCHEMY_DATABASE_URI =用户名:密码@数据库主机/数据库?字符集
之后再model文件夹下面新建一个__init__.py
创建一个db对象 还要将db和app做绑定 并且把表也导入运行
相关的user.py
相当于新建一张user表 而设定的字段如果指定为String类型 则需要指定长度
User里面的每隔class都是一个模型 它都要继承db.Model类
一个类会映射成数据库的一个表
类会实例化 而实例化的每个对象 就是表里面的一行记录
user.py里面: 新增用户
然后把蓝图绑定到app上面
用动态url实现删除
User.query.get()使用get查找,只针对主键 get的时候只能get到第一个 所以只能单条操作
改:还是一样只能修改一条
查:
在浏览器输入url请求会发生什么?
客户端发起请求
服务器收到请求 解析http包头(包头部字段有url和请求方法) 拿到body数据
通过url和请求方法来进行判断处理
view_function表里找到对应的视图函数
调用相应的视图函数做处理
可通过request对象对传入的参数进行获取
也可以通过动态url进行参数获取
如果有数据库的操作 就导入相应的模型类
这里通过操控orm对象来操控数据库,实现数据库的增删改查
对于查询操作,数据库的对象不能直接返回,需要对它进行序列化
需要相应的格式转化,建议使用json
返回相应api数据
关于序列化操作可以直接放在user.py的类里面
于是这边就不需要我们手动返回了
将单个查询和全部查询放在一个函数里
操纵数据库的时候一定要记得提交
项目需要统一返回标准化:
返回成json格式
需要返回状态码(status):定义程序的逻辑状态
还有message 解释状态码的意思
data 请求返回的数据 数据全部放在data里面
一般格式:{“status”:10000,“message”:“数据请求成功!”,“data”:[]}
于是把这个作为一个公共的设定 定义一个新的文件夹libs(存放公共函数)
然后创建一个utils(里面存放所有的工具)
这样就可以达到标准化 规范化
启动项目:
Flask提供接口 可以添加监控项 也可以展示监控项
因为我们现在没有前端 所以我们后面的展示操作等 都只能通过接口完成
对于普通用户而言,自己添加的监控项只有自己能看
对于管理员来看,所有的监控下都能看
对于项目user时 用户密码建议哈希存入 角色的话建议设置成枚举型
monitor里面存放的是监控表
表与表之间建立关系 (一定要设置外键)
在model的user.py里面跟monitor表创建连接
在命令行里面 帮助管理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程序
相当于进入app的内部
在这里操控的一切东西都是操控app
这样是的对象里面多了一个monitor属性 monitor属性里面就包含了user的id(因为id被设置成了外键)相同的监控项(也就是monitor表里的数据)
用户通过monitor属性来找到监控
monitor表又添加了反向查询user moniter的对象可以通过user属性来找到用户
这个关系不是数据库的 是orm的 就不用再连表查询了
把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 删除用户
现在可以通过server.py去运行 也可以通过命令行去运行
对于python调用Linux命令 推荐使用subprocess
查询是最容易考的!!!!!
按条件查询:
精确查询filter_by 模糊查询filter
Filter_by没有filter灵活
多条件:
排序:
限制:
查询小结:
查询小总结:
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去看我们是哪种类型的失败)