1.传统表单组成:
是由大量的html标签组成的,唯一繁琐的地方在于一旦表单写好之后,如果要进行更改和增加验证功能比较麻烦.
案例: 注册案例
注意点:
如果是表单提交,使用request.form获取
2.flask_wtf表单,属于flask的扩展包,通过类名称渲染表单,然后字段的形式渲染标签.
好处:
1.提供了验证函数
2.提供了csrf校验机制.
使用流程:
1.安装扩展
pip install flask_wtf
from flask_wtf import FlaskForm
from wtforms import 字段
from wtforms.validates import 验证函数
2.自定义类继承自FlaskForm,编写字段和验证函数
3.创建表单,进行渲染
注意点:
1.由于flask_wtf表单提供了csrf验证机制,csrf_token的生成需要依赖于SECRET_KEY进行加密
2.如果是wtf表单,获取数据方式, form.username.data
3.flask_wtf表单默认开启了csrf校验.关闭方式:
4.通过validate_on_submit(),会校验:'POST', 'PUT', 'PATCH', 'DELETE'请求方式校验, 还会校验验证函数和csrf_token
3.ORM模型类表示的是扩展包flask_sqlahchemy中的SQLALchemy类
orm: 将模型类中的类名,属性,对象,映射成数据库里面的表名,字段,一行一行数据.
使用操作流程:
1.安装,导入包
pip install flask_sqlalchemy
from flask_sqlalchemy import SQLAlchemy
2.设置配置信息,比如:账号,密码地址等信息
3.创建SQLAlchemy类对象,关联app
4.编写模型类,继承db.Model
5.操作数据库使用方法而不是sql语句了.
添加单个对象:db.session.add(obj)
添加多个对象:db.session.add_all([obj1,obj2])
提交数据库: db.session.commit()
删除: db.session.delete()
回滚: db.session.rollback()
外键:用来表示表与表之间的关系,一般设置在多方
注意点:
1. 如果安装的数据库驱动是flask_mysqldb 使用mysql://root:123456@127.0.0.1:3306/basic8
2. 如果安装的数据库驱动是pymysql 使用mysql+pymysql://root:123456@127.0.0.1:3306/basic8
3. 默认生成的表名称是类名称小写,如果需要手动指定表名,编写__tablename__ = '表名'
4.图书馆小案例:
功能描述:
1. 可以添加书籍
如果作者存在,书籍存在,不能添加
如果作者存在,书籍不存在,可以添加
如果作者不存在, 可以添加
2. 删除书籍
3. 删除作者, 同时删除该作者的所有书籍
思路分析:
1.创建表单wtf
2.配置数据库
3.具体功能操作
数据库增加,删除,修改操作:
增加:
user = User(name='laowang')
db.session.add(user)
db.session.commit()
修改:
user.name = 'xiaohua'
db.session.commit()
删除:
db.session.delete(user)
db.session.commit()
查询所有用户数据
User.query.all()
查询有多少个用户
User.query.count()
查询第1个用户
User.query.all()[0]
查询id为4的用户[3种方式]
User.query.get(4)
User.query.filter_by(id = 4).first()
User.query.filter(User.id == 4).first()
查询名字结尾字符为g的所有数据[开始/包含]
User.query.filter(User.name.endwith('g')).all()
User.query.filter(User.name.startswith('g')).all()
User.query.filter(User.name.contains('g')).all()
查询名字不等于wang的所有数据[2种方式]
查询名字和邮箱都以 li 开头的所有数据[2种方式]
User.query.filter(User.name.startswith('li'),User.email.startswith('li')).all()
User.query.filter(and_(User.name.startswith('li'),User.email.startswith('li'))).all()
查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据
User.query.filter(or_(User.password == '123456',User.email.endswith('itheima.com'))).all()
查询id为 [1, 3, 5, 7, 9] 的用户列表
User.query.filter(User.id.in_([1,3,5,7,9])).all()
查询name为liu的角色数据
user = User.query.filter(User.name == 'liu').first()
role = Role.query.filter(Role.id == user.role_id).first()
查询所有用户数据,并以邮箱排序
User.query.order_by(User.email).all()
User.query.order_by(User.email.desc()).all()
每页3个,查询第2页的数据
paginate = User.query.paginate(page, per_page,Error_out)
paginate = User.query.paginate(2,3,False)
page: 哪一个页
per_page: 每页多少条数据
Error_out: False 查不到不报错
pages: 共有多少页
items: 当前页数的所有对象
page: 当前页
传统表单的渲染
wtf表格的页面渲染
library