Flask学习笔记(三)

目录

SQLAlchemy

Migrate

Blueprints

走QQ服务器,发送邮件验证码

Jquery介绍

点击前端页面,发送后端请求

后端验证邮箱


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"))

参考链接

Flask框架入门教程(非常详细)从零基础入门到精通,看完这一篇就够了-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值