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