Flask框架的视图函数编写

Flask框架的视图函数编写

# 用户注册信息视图函数
from flask import render_template, request, url_for, flash, redirect
from werkzeug.security import check_password_hash

from app.form.auth import RegisterForm, LoginForm, EmailForm, ResetPassWordForm
from app.models.base import db
from app.models.user import User
from . import web
from flask_login import login_user, logout_user
from app.libs.email import send_email  # 调用send_emai


# 注册视图函数
@web.route('/register', methods=['GET', 'POST'])
def register():
    # 验证层的调用,request.form
    form = RegisterForm(request.form)
    # 用户提交注册信息,是POST方法,验证层通过,validate
    if request.method == 'POST' and form.validate():
        # auto_commit()事务的自动提交
        with db.auto_commit():
            user = User()
            # 用户的注册信息的传入
            user.set_attrs(form.data)
            # 传入sqlalchemy的核心对象,再使用session下的add方法实现数据库与模型的连接
            # 实例化模型添加进去add
            db.session.add(user)
            # 提交数据到数据库里面去commit
        # db.session.commit()
        # 重定向,使用url_for指向web.auth
        return redistor(url_for('web.login'))
    # 返回到注册页面
    # form=form, 在模板渲染的时候实现信息的保存
    return render_template('auth/register', form=form)

# 登入的视图函数编写
@web.route('/login', methods=['GET', 'POST'])
def login():
    # request.form是用户填写的信息
    form = LoginForm(request.form)
    if request.method == 'POST' and form.validate():
        # User.query.filter_by(email=form.data.first())是数据库的信息
        user = User.query.filter_by(email=form.data.first())
        # 如果user为真,并且密码通过
        if user and check_password_hash(form.password.data):
            # 调用第三方插件,实现用户的票据管理,间接的把用户票据写到cookie
            login_user(user, remember=True)
            # 这样写会实现cookie的保存,默认保存365天
            # 获取request.args后面next以后的值
            next = request.args.get('next')
            # next不为空,或者next.startswith以'/'开头
            if not next or not next.startswith('/'):
                # url_for生成一个url
                next = url_for('web.index')
            return redirect(next)
        else:
            flash('账号不存在或者密码为空')

    return render_template('auth/login.html', form=form)

#重置密码视图函数
@web.route('/reset/password', methods=['GET', 'POST'])
def forget_password_request():# 忘记密码函数
    form = EmailForm(request.form)  # 传到EmailForm中,进行验证
    if request.method == 'POST':# 如果是POST的方法
        if form.validate():# validate验证器
            account_email = form.email.date# 拿到用户的账号
            user = User.query.filter_by(email=account_email).first_or_404# 对照数据表中的哪个user
            send_email(form.email.data, '重置你的密码',
                       'email/reset_password.html', user=user,
                       token=user.generate_token)
            # 发送成功以后,提醒用户发送成功
            flash('一封邮件已经发送到邮箱' + account_email + ',请及时查收')
            # 发送成功以后,返回到登入界面
            return redirect(url_for('web.login'))
    return render_template('auth/forget_password_request.html', form=form)# 把form传进来
    # 点击了忘记密码按钮,返回到auth/forget_password_request.html页面


# 密码测试函数
@web.route('/reset/password/<token>', methods=['GET', 'POST'])
def forget_password(token):
    form = ResetPassWordForm(request.form)
    if request.methods == 'POST' and form.validate():
        success = User.reset_password(token, form.passwd1.data)# 密码重定义,传入密码
        if success:
            flash('你的密码已经更新,请用您的新密码进行登入')
            return redirect(url_for('web.login'))# 重定向到登入页面
        else:
            flash('密码重置失败')
    return render_template('auth/forget_password.html', form=form)# 返回忘记密码页面

# 改密码的视图函数
@web.route('/change/password', methods=['GET', 'POST'])
def change_password():
    form = ChangePasswordForm(request.form)
    if request.method == 'POST' and form.validate():
        current_user.password = form.new_password1.data
        db.session.commit()
        flash('密码已更新成功')
        return redirect(url_for('web.personal'))
    return render_template('auth/change_password.html', form=form)

# 注销视图函数
@web.route('/logout')
def logout():
    logout_user()# 用户的注销,清除浏览器中的cookie
    return redirect(url_for('web.index'))# 重定向到首页去
    pass

猜你喜欢

转载自blog.csdn.net/weixin_43734271/article/details/88996499