Flask_WTF表单和flask数据库相关的操作

一、Flask_WTF表单和CSRF保护

安装语句:

pip install flask-wtf

CSRF保护

app = Flask(__name__)
#设置app的config字典app的config字典用来存储框架、扩展和程序本身的配置变量。
app.config['vdsdshidfhuhiuidi'  
#第二种添加秘钥方法
app.secret_key='vdsdshidfhuhiuidi'

二、使用flask-wtf

from wtforms import StringField,PasswordField,SubmitField
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired,EqualTo,Length,NumberRange

#设置表单
class Register(FlaskForm):
    #username
    username=StringField(label='用户名',validators=[DataRequired()],render_kw={'placeholder':'请输入用户名'})
    #password
    pwd=PasswordField(label='密码',validators=[DataRequired()],render_kw={'placeholder':'请输入密码'})
    #confirm password
    cpwd=PasswordField(label='密码',validators=[DataRequired()],)
    #submit
    submit=SubmitField('提交')

validators指定一个由验证函数组成的列表 。(排除非法输入)

附:WTFForms支持的HTML标注字段

字段类型 说  明
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文本字段
DateField 文本字段值为datetime.date 格式
DateTimeField 文本字段值为datetime.datetime 格式
IntegerField 文本字段值为整数
DecimalField 文本字段,值为decimal.Decimal
FloatField 文本字段,值为浮点数
BooleanField 复选框,值为True 和False
RadioField 一组单选框
SelectField 下拉列表
SelectMultipleField 下拉列表,可选择多个值
FileField 文件上传字段
SubmitField 表单提交按钮
FormField 把表单作为字段嵌入另一个表单
FieldList 一组指定类型的字段

WTForms验证函数如下表:

Email 验证电子邮件地址
EqualTo 比较两个字段的值;常用于要求输入两次密码进行确认的情况
IPAddress 验证IPv4 网络地址
Length 验证输入字符串的长度
NumberRange 验证输入的值在数字范围内
Optional 无输入值时跳过其他验证函数
Required 确保字段中有数据
Regexp 使用正则表达式验证输入值
URL 验证URL
AnyOf 确保输入值在可选值列表中
NoneOf 确保输入值不在可选值列表中

把表单渲染成HTML

<form method="post">
    {{  form.csrf_token()}}
    {{ form.username.label }}{{ form.username }}
    {{ form.pwd.label }}{{ form.pwd }}<br>
    {{ form.cpwd.label }}{{ form.cpwd }}<br>
    {{ form.submit}}

结果如下:
Flask_WTF表单和flask数据库相关的操作_第1张图片

三、数据库相关的操作

迁移

第一种方法:
首先安装(在Ubuntu系统终端下)

pip install flask_migrate
pip install flask_script

main.py

from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
		                              #数据库种类
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:[email protected]:3306/testdb'
#创建数据库管理对象
db=SQLAlchemy()

manager=Manager(app,db)
manager.add_command('db_command',MigrateCommand)#添加db 命令(runserver的用法)
if __name__ == '__main__':

     manager.run()

注意
Flask_WTF表单和flask数据库相关的操作_第2张图片
其中
这样,准备工作已经就绪。

  • 运行python文件名 db init创建数据表。并且会在你项目下生成migrations/目录,保存你数据库每次变更的内容。

修改User类。

  • python 文件名 db_command(自定义命令在这为db_command) migrate -m ‘备注’ 提交修改
  • python 文件名 db_command(自定义命令在这为db_command) upgrade 执行修改
  • python 文件名 db_command(自定义命令在这为db_command) history 查看迁移历史

第二种方法:(该方法在实际应用中并不适用)

 db=SQLAlchemy()
 
if __name__ == '__main__':

     db.create_all()

当数据表中出现user时,说明成功。
Flask_WTF表单和flask数据库相关的操作_第3张图片

四、数据库CRUD

db=SQLAlchemy(app)
if __name__ == '__main__':

    db.drop_all()#删除
    db.create_all()#加入U
    obj1=User(name='小王')
    obj2=User(name='小李',email='[email protected]')
    obj3=User(name='小张',email='[email protected]')
    obj4=User(name='小杨',email='[email protected]')
    db.session.add_all([obj1,obj2,obj3,obj4])#添加
    db.session.commit()#提交


    app.run(debug=True,port=5001)

数据库如下所示:
Flask_WTF表单和flask数据库相关的操作_第4张图片

flask数据库操作命令

增加:
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)
查询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()
Flask_WTF表单和flask数据库相关的操作_第5张图片
注意: __repr __用于返回一个可读性的数据

class User(db.Model):
    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(20),unique=True)
    is_delete=db.Column(db.Boolean,default=False)
    email=db.Column(db.String(30),nullable=True)

    def __repr__(self):
    	#非必须,用于调试或者测试时候,返回具有一个可读性的数据
        return self.name

你可能感兴趣的:(flask)