在本篇中,我们将讨论如何在 Flask 应用中实现用户注册功能。这个功能将以之前的数据库迁移为基础,我们也将为后续的用户登录功能做好准备。我们会通过实例进行讲解,以便于理解和应用。
环境准备 首先,确保你已经创建了一些必要的文件和目录,并且将 SQLAlchemy 和 Flask-Migrate 安装到你的虚拟环境中。如果你还没有设置这些,可以参照以下命令:
1 pip install Flask Flask-SQLAlchemy Flask-Migrate
创建用户模型 在之前的数据库迁移中,我们已经设置了 Flask 应用以及数据库配置。现在,我们将创建一个用户模型,以便存储用户的数据。
1 2 3 4 5 6 7 8 9 10 11 from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy() class User (db.Model): id = db.Column(db.Integer, primary_key=True ) username = db.Column(db.String(80 ), unique=True , nullable=False ) password_hash = db.Column(db.String(128 ), nullable=False ) def __repr__ (self ): return f'<User {self.username} >'
在上述代码中,我们定义了一个 User
类,它继承自 db.Model
。此模型包含三个字段:
id
: 用户的唯一标识。
username
: 用户名,要求唯一且不能为空。
password_hash
: 用于存储加密后的密码。
创建用户注册表单 接下来,我们将创建一个用于用户注册的表单。我们将使用 Flask-WTF 来简化表单处理。
首先,安装 Flask-WTF:
然后,创建一个表单文件 forms.py
:
1 2 3 4 5 6 7 8 9 from flask_wtf import FlaskFormfrom wtforms import StringField, PasswordField, SubmitFieldfrom wtforms.validators import DataRequired, EqualToclass RegistrationForm (FlaskForm ): username = StringField('Username' , validators=[DataRequired()]) password = PasswordField('Password' , validators=[DataRequired()]) confirm_password = PasswordField('Confirm Password' , validators=[DataRequired(), EqualTo('password' )]) submit = SubmitField('Register' )
在这个表单中,我们创建了三个字段:
username
: 用户名,不能为空。
password
: 密码,不能为空。
confirm_password
: 确认密码,以确保用户输入相同的密码。
注册视图函数 现在,我们来实现用户注册的视图。我们将在 app.py
文件中添加注册处理逻辑。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from flask import Flask, render_template, redirect, url_for, flashfrom forms import RegistrationFormfrom models import db, Userfrom werkzeug.security import generate_password_hashapp = Flask(__name__) app.config['SECRET_KEY' ] = 'your_secret_key' app.config['SQLALCHEMY_DATABASE_URI' ] = 'sqlite:///site.db' db.init_app(app) @app.route('/register' , methods=['GET' , 'POST' ] ) def register (): form = RegistrationForm() if form.validate_on_submit(): hashed_password = generate_password_hash(form.password.data, method='sha256' ) new_user = User(username=form.username.data, password_hash=hashed_password) db.session.add(new_user) db.session.commit() flash('Registration successful! You can now log in.' , 'success' ) return redirect(url_for('login' )) return render_template('register.html' , form=form) if __name__ == '__main__' : app.run(debug=True )
在 register
视图中,我们首先实例化 RegistrationForm
,然后检查表单是否通过验证。如果验证通过,使用 generate_password_hash
对用户的密码进行加密,并创建一个新用户对象。最后,将用户存入数据库,并重定向到登录页。
创建注册模板 最后,我们需要一个 HTML 模板来渲染注册表单。创建文件 register.html
,并添加以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <!doctype html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Register</title > </head > <body > <h1 > Register</h1 > <form method ="POST" > {{ form.hidden_tag() }} <p > {{ form.username.label }}<br > {{ form.username(size=32) }}<br > {% for error in form.username.errors %} <span style ="color: red;" > [{{ error }}]</span > {% endfor %} </p > <p > {{ form.password.label }}<br > {{ form.password(size=32) }}<br > {% for error in form.password.errors %} <span style ="color: red;" > [{{ error }}]</span > {% endfor %} </p > <p > {{ form.confirm_password.label }}<br > {{ form.confirm_password(size=32) }}<br > {% for error in form.confirm_password.errors %} <span style ="color: red;" > [{{ error }}]</span > {% endfor %} </p > <p > {{ form.submit() }}</p > </form > </body > </html >
在这个模板中,我们使用了 Flask-WTF 提供的表单渲染,确保显示任何验证错误。
小结 在本篇中,我们完成了用户注册功能的实现。用户输入的密码会通过 SHA-256 算法进行加密,增强了安全性。用户注册后会被重定向到登录页面,接下来我们将在下篇中实现用户登录功能。
如果你有任何问题或需要更多帮助,请随时提问!