1.安装flask-wtf
flask表单验证基于flask-wtf
安装flask-wtf命令
pip install flask-wtf
2.建立表单验证函数
安装email_validator
pip install email_validator
在blueprints文件夹中新建一个forms.py文件
加入下面代码,主要用来验证前端提交的数据是否符合要求
import wtforms
from wtforms.validators import Email,Length,EqualTo
from models import UserModel,EmailCaptchaModel
# Form:主要用来验证前端提交的数据是否符合要求
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",message="密码输入不一致!")])
#自定义验证
#1.邮箱是否已经被注册
def validate_email(self,field):
email = field.data
user = UserModel.query.filter_by(email=email).first()
if user:
raise wtforms.ValidationError(message="该邮箱已经被注册!")
# 2.验证码是否正确
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="邮箱或验证码错误!")
3.更改注册函数
更改auth.py
from flask import Blueprint,render_template,jsonify,redirect,url_for
from exts import mail,db
from flask_mail import Message
from flask import request
import string,random
from models import EmailCaptchaModel,UserModel
from .forms import Registerform
from werkzeug.security import generate_password_hash
# /auth
bp = Blueprint("auth",__name__,url_prefix="/auth")
@bp.route("/login")
def login():
return "登录页面"
@bp.route("/register",methods=['GET','POST']) #即可以使用GET请求,也可以使用POST请求
def register():
if request.method == "GET":
return render_template("register.html")
else:
#表单验证,flask-wtf:wtfarms
#验证用户提交的邮箱和验证是否正确
form = Registerform(request.form)
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"))
else:
print(form.errors)
return redirect(url_for("auth.register"))
@bp.route("/captcha/email")
def get_email_captcha():
# /capthca/email/<email>
# /capthca/email?email=xxx@qq.com
email = request.args.get("email")
source = string.digits*4
captcha = random.sample(source,4)
captcha = "".join(captcha)
message = Message(subject="问答平台注册验证码", recipients=[email], body=f"你的验证码是:{captcha}")
mail.send(message)
#存储验证码到数据库
email_captcha = EmailCaptchaModel(email=email,captcha=captcha)
db.session.add(email_captcha)
db.session.commit()
# RESTful API
result = {"code":200,"message":"","data":None}
return jsonify(result)
@bp.route("/mail/test")
def mail_test():
message = Message(subject="邮箱测试",recipients=["507303922@qq.com"],body="这是一条测试邮件")
mail.send(message)
return "邮件发送测试"
注意: password=generate_password_hash(password)密码使用了加密存储,需要更改下数据库的长度,models.py中UserModel中更改password的长度为200,然后重新同步下(flask db migrate,flask db upgrade)
4.测试注册
更改ragister.html中注册表单,POST请求
<form method="POST">
可以不加地址,就是默认向当前地址发起POST请求
访问注册地址测试http://127.0.0.1:5000/auth/register
注册成功,调整到登录页面
在数据库中可以看到注册的用户数据