目录
SQLAlchemy
介绍:
是一个Python库,提供了一种与多种数据库进行交互的灵活方式。相比于直接使用 SQL 语句,SQLAlchemy 提供了更加 Pythonic 的方式进行数据库操作。
安装方式:
pip install sqlalchemy
创建一个数据库并且绑定flask程序:
db = SQLAlchemy()#创建一个SQLAchemy实例,通过db变量可以访问SQLAlchemy提供的方法和属性,进行数据库操作。
db.init_app(app)#创建但是没有进行初始化
调用Model方法来创建一个表格:
class UserModel(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(100), nullable=False, unique=True)
join_time = db.Column(db.DateTime, default=datetime.now)
Migrate
介绍:
这是Flask-Migrate扩展中提供的一个类,用于管理数据库迁移。是一个Flask扩展,它为Flask应用提供了数据库迁移的功能。这样,当你的数据库模型发生变化时,你可以轻松地更新数据库结构,而不会丢失数据。
migration 一旦建立好,就不要修改! 不要删除! 要修改数据库,就建立新的migration
migrate = Migrate(app, db)#绑定到数据库
#flask db init这个只需要执行一次
#当数据库结构发生改变的时候执行一次 flask db migrate
#同时更新数据库 flask db upgrade
Blueprints
介绍:
在flask程序中,使用传统的模块化是行不通的,需要flask提供一个特有的模块化处理方式,flask内置了一个模块化处理的类,即Blueprint。
创建一个Blueprint
from flask import Blueprint, render_template
bp = Blueprint('auth', __name__, url_prefix='/auth')
#在这个模块下面的URL前面都要加上一个/auth
@bp.route('/login')
def login():
pass
在其它文件调用的时候,可以重命名
from blueprints.qa import bp as qa_bp
from blueprints.auth import bp as auth_bp
走QQ服务器,发送邮件验证码
配置邮箱
#邮箱配置
MAIL_SERVER = "smtp.qq.com"
MAIL_USE_SSL = True
MAIL_PORT = 465
MAIL_USERNAME = "QQ账号@qq.com"
MAIL_PASSWORD = "生成的邮箱序列号"
MAIL_DEFAULT_SENDER = "QQ账号@qq.com"
后端视图函数
@bp.route("/captcha/email")
def captcha_email():
email = request.args.get("email")
source = string.digits*4#0~9有四个,不然函数只会从0~9每个数取一次
captcha = random.sample(source, 4)
captcha = "".join(captcha)#catcha返回的是一个列表,通过这样返回一个字符串
message = Message(subject="知了传课注册验证码",recipients=[email],body=f"您的验证码是:{captcha}")#from flask_mail import Message是一个库,需要引用
mail.send(message)
#用数据库的方式存储
email_captcha = EmailCaptchaModel(email = email, captcha = captcha)
db.session.add(email_captcha)#db是在exts.py文件里面通过db = SQLAlchemy()建立的,需要引入
db.session.commit()
#返回统一的类
return jsonify({"code":200,"message":"","data":None})
前端触发后端视图函数
Jquery介绍
jQuery是JavaScript的一个工具库,工具库就是指封装好的JavaScript函数,可以直接在程序中进行调用,那jQuery就是一款非常流行的JavaScript库。jQuery设计的宗旨是“写更少的代码,做更多的事情”。jQuery库封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
点击前端页面,发送后端请求
//整个网页加载完毕后加载这个函数
$(function () {
$("#captcha-btn").click(function (event) {
event.preventDefault();
var email = $("input[name = 'email']").val();
//$可以看作是query的一个引用
//ajax是异步的JavaScript和XML,Ajax其实就是浏览器与服务器之间的一种异步通信方式
$.ajax({
url:"/auth/captcha/email?email="+email,
method:"GET",
//result就是这个函数执行成功后的一个返回结果
success:function (result){
var code = result['code'];
if(code == 200){
alert("邮箱验证码发送成功!")
}
},
fail:function (error)
{
console.log((error));
}
})
});
});
后端验证邮箱
先创建一个验证表单
#表单验证信息
import wtforms
from wtforms.validators import Email, length, EqualTo, Length
from models import UserModel, EmailCaptchaModel
from exts import db
class RegisterForm(wtforms.Form):
email = wtforms.StringField(validators=[Email(message="邮件格式错误")])
captcha = wtforms.StringField(validators=[Length(min=4,max=4,message="验证码格式错误")])
username = wtforms.StringField(validators=[Length(min=3, max=20,message="用户名格式错误")])
password = wtforms.StringField(validators=[Length(min=6,max=20,message="密码格式错误")])
password_confirm = wtforms.StringField(validators=[EqualTo("password")])
#自定义验证
#1.邮箱是否已经被注册过
#2.验证码是否正确
def validate_email(self, field):
email = field.data
user = UserModel.query.filter_by(email = email).first()#查找数据库是否有邮箱为这个的
if user:
raise wtforms.ValidationError(message="邮箱已经被注册过了")#抱message信息
#self代表的是当前的对象
def validate_captcha(self, field):
captcha = field.data
email = self.email.data
captcha_model = EmailCaptchaModel.query.filter_by(email=email,captcha = captcha).first()
if not captcha_model:
raise wtforms.ValidationError(message="邮箱或者验证码错误")
else:
db.session.delete(captcha_model)
db.session.commit()
特殊的规则自定义完成
前端输入后,完成验证
#GET:从服务器上获取数据
#POST:将客户端的数据提交给服务器
@bp.route('/register',methods=['GET','POST'])
def register():
if request.method == "GET":
return render_template("register.html")
else:
# 验证用户提交的邮箱和验证码是否对应正确
# 表单验证:flask-wtf:wtforms
#request.form从前端拿到表单数据
form = RegisterForm(request.form)#拿到前端提交的表单数据,并且扔给RegisterForm进行验证,form此时是一个RegisterForm的类
if form.validate():
email = form.email.data
username = form.username.data
password = form.password.data
user = UserModel(email = email, username = username, password = generate_password_hash(password))
db.session.add(user)
db.session.commit()
return redirect(url_for("auth.login"))#重定向到login页面
else:
print(form.errors)
return redirect(url_for("/auth.register"))
参考链接