1、添加用户注册表单
app/auth/forms.py 用户注册表单
表单使用WTForms提供的Regexp验证函数,确保username字段只包含字母、数字、下划线和点号,这个验证函数中正则表达式后面的两个参数分别是正则表达式的旗标和验证失败时显示的错误消息
from flask_wtf import Form
from wtforms import StringField, PasswordField, BooleanField, SubmitField, validators, ValidationError
from wtforms.validators import Length, Email, Required, Regexp, EqualTo
from ..models import User
class RegistrationFrom(Form): email = StringField('Email', validators=[Required(), Length(1, 64), Email()]) username = StringField('Username', validators=[Required(), Length(1, 64), Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0, 'Usernames, dots or underscores')]) password = PasswordField('Password', validators=[Required(), EqualTo('password2', message='Passwords must match.')]) password2 = PasswordField('Confirm password', validators=[Required()]) submit = SubmitField('Register') def validate_mail(selfself, field): if User.query.filter_by(email=field.data).first(): raise ValidationError('Eamil already registered') def validate_username(self, field): if User.query.filter_by(username=field.data).frist(): raise ValidationError('Username already in use.')
2、显示登录表单
app/templates/auth/register.html
{% extends "base.htmml" %} {% import "bootstrap/wtf.html" as wtf %} {% block title %}Flasky - Register {% endblock %} {% block page_content %} <div class="page-header"> <h1>Register</h1> </div> <div class="col-md-4"> {{ wtf.quick_form(form) }} </div> {% endblock %}
3、链接到注册页面
app/templates/auth/login.html
登录页面要显示一个指向注册页面的链接,让没有账户的用户能轻易找到注册页面
{% extends "base.html" %} {% import "bootstrap/wtf.html" as wtf %} {% block title %}Flasky - Login{% endblock %} {% block page_content %} <div class="page-header"> <h1>Login</h1> </div> <div class="col-md-4"> {{ wtf.quick_form(form) }} <p>New user? <a href="{{ url_for('auth.register') }}">Click here to register</a>.</p> </div> {% endblock %}
注册新用户
1、用户注册路由
app/auth/views.py
提交注册表单,通过验证后,系统就使用用户填写的信息在数据库中添加一个用户
from flask import render_template, redirect, request, url_for, flash from flask_login import login_user, login_required, logout_user from . import auth from ..models import User,db from .forms import LoginForm,RegistrationFrom #蓝本中的路由和视图函数 @auth.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(email=form.email.data).first() if user is not None and user.verify_password(form.password.data): login_user(user, form.remeber_me.data) return redirect(request.args.get('next') or url_for('main.index')) flash('Invalid username or password.') return render_template('auth/login.html', form=form) #登出用户 @auth.route('/logout') @login_required def logout(): logout_user() flash('You have been logged out.') return redirect(url_for('main.index')) #用户注册路由 @auth.route('/register', methods=['GET', 'POST']) def register(): form = RegistrationFrom() if form.validate_on_submit(): user = User(email=form.email.data, username=form.username.data, password=form.password.data) db.session.add(user) flash('You can now login.') return redirect(url_for('auth.login')) return render_template('auth/register.html', form=form)