注册校验
注册使用wtforms模块和email-validator模块去读取和校验数据。
pip install flask-wtf
pip install email-validator
代码
froms.py
import wtforms
from wtforms.validators import Email, Length, EqualTo
# 导入数据库模型
from models import UserModel, EmailCaptchaModel
from exts import db
# 后端校验,验证器
# 继承自wtfforms中的表单功能直接使用
class RegisterForm(wtforms.Form):
# 验证器validators
email = wtforms.StringField(validators=[Email(message="邮箱格式错误,请重新输入!")])
captcha = wtforms.StringField(validators=[Length(min=6, max=6, message='验证码格式错误!')])
username = wtforms.StringField(validators=[Length(min=3, max=20, message="用户名格式错误,3-20位。")])
password = wtforms.StringField(validators=[Length(min=8, max=20, message="密码格式错误,8-20位")])
# 再次确认密码是否一致
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="邮箱或者验证码错误!")
# 用完验证码后删除,后续改进使用redis
# else:
# db.session.delete(captcha)
# db.session.commit()
# 完成注册功能 使用校验器完成注册功能,也就是将通过校验的数据存储到数据表中。数据库使用orm操作。 Flask 数据库操作一把梭。 参考[ Flask 数据库操作一把梭。](https://blog.csdn.net/qq_41690468/article/details/130256151)
代码
auth.py
import random
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
from models import EmailCaptchaModel
# 引入验证码部分代码
from .froms import RegisterForm
from models import UserModel
# 加密密码
from werkzeug.security import generate_password_hash
# /auth
bp = Blueprint("auth", __name__, url_prefix="/auth")
# 也就是前面已经定义好前缀,/auth/login
@bp.route("/login")
def login():
return "注册成功"
# GET: 从服务器上获取数据
# 这里注册,使用POST请求,将客户端的数据提交给服务器
@bp.route("/register", methods=['GET', 'POST'])
def register():
# 验证用户提交的邮箱和验证码是否对应且正确
# 表单验证: flask-wtf
if request.method == 'GET':
# 渲染文件
return render_template("register.html")
# 除了get请求就是post请求
else:
# 验证码,密码等验证,如果通过了验证码
form = RegisterForm(request.form)
if form.validate():
email = form.email.data
username = form.username.data
password = form.password.data
# 使用ORM模型操作数据库
user = UserModel(email=email, username=username, password=generate_password_hash(password))
db.session.add(user)
db.session.commit()
# 跳转到登录页面,第二种方法直接跳转,第一次方法使用url_for 视图化链接
return redirect(url_for("auth.login"))
# return redirect("/auth/login")
# 通过验证的话执行注册,也就是把数据保存到数据库中
else:
print(form.errors)
# 注册失败重新跳转到注册页面
return redirect("/auth/register")
# bp.route: 如果没有指定methods参数,默认就是GET请求
@bp.route("/captcha/email")
def get_email_captcha():
# url传参数
# /captcha/emial?email=xxx@qq.com
email = request.args.get("email")
print(email)
# 6位,数字和字母的组成
source = string.digits*6
captcha = random.sample(source, 6)
# 列表变成字符串
captcha = "".join(captcha) # 965083
print(captcha)
# I/O 操作
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,这是一个格式
# {code:200/400/500, message: "xxx", data: {}}
return jsonify({"code":200, "message": "", "data": None})
# memcached 和redis 适合存储验证,这里扩展,这里暂用数据库来存储
app.py
from flask import Flask
import config
from exts import db, mail
from models import UserModel
from blueprints.qa import bp as qa_bp
from blueprints.auth import bp as auth_bp
from flask_migrate import Migrate
from models import EmailCaptchaModel
app = Flask(__name__)
app.config.from_object(config)
# 创建app后,再与db 和app绑定
db.init_app(app)
# 初始化mail连接
mail.init_app(app)
migrate = Migrate(app, db)
# blueprint,用来做模块化的
# 蓝图,视图函数模块化,蓝图
# 注册蓝图
app.register_blueprint(qa_bp)
app.register_blueprint(auth_bp)
@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'
if __name__ == '__main__':
app.run()
图例
注册成功
password存储到数据库中式加密的