3.构造表单
根据前端的页面,构造后端的表单
formModel.py
,用于实现基本的表单验证.from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, IntegerField, FloatField, BooleanField
from wtforms.validators import Length, Email, EqualTo, Regexp, NumberRange
class LoginForm(FlaskForm):
"""构造登录页面验证表单"""
email = StringField(validators=[Email(message="邮箱不符合")])
password = PasswordField(validators=[Length(6, 18, "密码长度不够")]) # 不验证复杂度
lifetime = BooleanField(validators=[]) # 验证为空,默认是False, 选择checkbox 变成True
class RegisterForm(FlaskForm):
"""构造注册页面表单验证"""
email = StringField(validators=[Email(message="邮箱不符合")])
username = StringField(validators=[Length(6, 18, "用户名长度不符合")])
password = PasswordField(validators=[Length(6, 18, "密码长度不够")]) # 不验证复杂度
password_repeat = PasswordField(validators=[EqualTo("password", "密码不匹配")])
phone = StringField(validators=[Regexp(r'1[34578]d{9}',message='手机号不匹配')])
class SaveMoneyForm(FlaskForm):
"""构造存钱表单验证"""
add_money = FloatField(validators=[NumberRange(min=1, max=10000, message='1-10000')]) # 一次性最多10000
class TransferForm(FlaskForm):
"""构造转账页面表单验证"""
transfer = FloatField(validators=[NumberRange(min=1,max=1000,message='1-1000')]) # 一次最多转账一千
transfer_name = StringField(validators=[Length(min=6,max=18,message='6-18位字符串')])
4.添加数据库支持
使用
Flask-SQLAlchemy
来提供操作MySQL
.需要注意的是,
app.py
和sql_model
不能相互引用,必须借用第三个文件exts.py
来引用.确保数据库中已经存在
flask_csrf_demo
数据库,如果不存在,需要创建.# config.py
# 数据库支持
msg = "mysql+pymysql://root:2008.Cn123@192.168.0.101:3306/flask_csrf_demo"
SQLALCHEMY_DATABASE_URI = msg
SQLALCHEMY_TRACK_MODIFICATIONS = False # 关闭追踪# exts.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()# app.py
from exts import db
db.init_app(app)我们测试的效果是劫持
cookie
的情况下,让账户中的金额增长和减少,这样按照需求,设计一张表,只需要基本的信息即可.# mysqlModel.py
from exts import db
class BankUser(db.Model):
"""ORM对应"""
__tablename__ = 'bankUser'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
email = db.Column(db.String(45), nullable=False)
username = db.Column(db.String(45), nullable=False)
password = db.Column(db.String(45), nullable=False)
phone = db.Column(db.String(45), nullable=False)
balance = db.Column(db.Float(45), nullable=False, default=0) # 余额
5.管理数据库版本
创建
manager.py
来管理数据库版本from flask_script import Manager
from exts import db
from flask_migrate import MigrateCommand, Migrate
from app import app
from mysqlModel import BankUsers
# 导入Mnager并绑定app
manager = Manager(app)
# 导入flaks_migrate
# Migrate 绑定app,db
Migrate(app, db)
# MigrateCommand 可以使用Alembic的命令
#
manager.add_command('db', MigrateCommand) # db是别名
if __name__ == '__main__':
manager.run()测试:
$ python manager.py db --help
usage: Perform database migrations如果能正常出现内容,说明配置成功.然后创建数据库迁移脚本
# 初始化
❯ python manager.py db init
# 创建迁移脚本
❯ python manager.py db migrate
# 数据库版本升级 切换到hand
❯ python manager.py db upgrade验证数据库
❯ mycli -h 192.168.0.101 -u root
Password:
mysql root@192.168.0.101:(none)> use flask_csrf_demo;
You are now connected to database "flask_csrf_demo" as user "root"
Time: 0.006s
mysql root@192.168.0.101:flask_csrf_demo> show tables;
+---------------------------+
| Tables_in_flask_csrf_demo |
+---------------------------+
| alembic_version |
| bankusers |
+---------------------------+
2 rows in set
Time: 0.023s以上,创建数据库成功.
6.连接数据库并验证
修改
app.py
的registerlogin
类,实现数据库注册和验证.在实现之前,暂时关闭
CSRF
# config.py
# 显式关闭CSRF
WTF_CSRF_ENABLED = False# app.py
# 注册页
class RegisterView(views.MethodView):
def get(self):
return render_template('register.html')
def post(self):
# 验证表单
form = RegisterForm()
# validata_on_submit自动判断post/get
if form.validate_on_submit():
email = form.email.data
username = form.username.data
password = form.password.data
phone = form.phone.data
# 插入数据库
user = BankUsers(email=email, username= username, password=password, phone=phone)
db.session.add(user) # 添加用户
db.session.commit() # 提交数据
return render_template('login.html')
else:
return render_template('register.html', info=form.errors) # 表单验证错误返回消息
# 登录页
class LoginView(views.MethodView):
def get(self):
return render_template('login.html')
def post(self):
# 验证表单
form = LoginForm()
if form.validate_on_submit():
# 表单验证成功,就跳转到数据库验证
print('表单验证成功')
email = form.email.data
password = form.password.data
lifetime = form.lifetime.data
# 数据库判断
print(email, password, lifetime)
exist_user = db.session.query(BankUsers).filter(BankUsers.email==email).filter(BankUsers.password==password).first()
print(exist_user)
if exist_user != None:
if lifetime:
return redirect(url_for('personal'))
else:
return redirect(url_for('personal'))
else:
return render_template('login.html', info=form.errors)
else:
return render_template('login.html', info="用户名密码不正确,请注册")以上的逻辑很简单,先验证表单,表单成功后,去数据库中验证,都验证成功后,跳转到个人页面(
personal.html
)
运行项目后,进入注册页面,注册基本信息 10312
然后进入登录页面,登录刚才的注册信息,注意我这里使用的是邮箱来验证的. 10313
成功后会跳转到 personal.html
– END –
原文始发于微信公众号(Flask学习笔记):CSRF攻击和防护(2)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/36491.html