用户身份验证(四)
程序员文章站
2022-07-14 14:27:34
...
一. 添加用户注册表单
注册页面的表单要求用户输入电子邮件地址、用户名和2次密码,app/auth/forms.py: 用户注册表单
class RegistrationForm(FlaskForm):
"""注册表单"""
email = StringField('Email', validators=[DataRequired(), Length(1, 64), Email()])
username = StringField('Username', validators=[
DataRequired(),
Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0,
'User names must have only letters,numbers,dots or underscores')])
password = PasswordField('Password', validators=[
DataRequired(),
EqualTo('password2', message='Password must match.')])
password2 = PasswordField('Confirm password', validators=[DataRequired()])
submit = SubmitField("Register")
def validate_email(self, field):
"""后端数据库验证邮箱是否已注册"""
if User.query.filter_by(email=field.data).first():
raise ValidationError('Email already registered.')
def validate_username(self, field):
"""后端验证同名用户是否已存在"""
if User.query.filter_by(username=field.data).first():
raise ValidationError('Username already in use.')
备注:
- username字段使用WTForms提供的Regexp验证函数,确保username字段值以字母开头,而且只包含字母、数字、下划线和点号;正则表达式后面的2个参数分别是“正则表达式的标志”和验证失败后的错误消息;
- EqualTo验证函数附属到两个密码字段中的一个上,另一个字段则作为参数传入;
- 如果表单中定义了以validate_开头后面跟着字段名的方法,这个方法将和常规验证一起调用。本例分别为email和username字段定义了验证函数,确保填写的值在数据库中没有出现;
- 自定义验证函数想要表示验证失败,可以抛出ValidationError异常,其参数就是错误消息。
二. 用户注册页面模板
登录页面需要有一个指向注册页面的链接,让没有账户的用户可以轻松注册;app/templates/auth/login.html:链接到注册页面:
<p>New user? <a href="{{ url_for('auth.register') }}">Click here to register</a>.</p>
app/templates/auth/register.html:注册页面模板
{% extends "base.html" %}
{% 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 %}
三. 注册新用户
app/auth/views.py:注册新用户的视图函数
@auth.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(email=form.email.data, username=form.username.data, password=form.password.data)
db.session.add(user)
db.session.commit()
token = user.generate_confirmation_token()
send_email(user.email, 'Confirm Your Account', 'auth/email/confirm', user=User, token=token)
flash('A confirmation email has been sent to you by email.')
return redirect(url_for('auth.login'))
return render_template('auth/register.html', form=form)
为确保认证用户提供的信息正确,此处使用发送电子邮件的形式来确认账户。下节将具体介绍确认邮件的发送细节~
上一篇: apply,call,bind的基本使用
下一篇: 名词笔记