20 用户注册

在本篇中,我们将讨论如何在 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 SQLAlchemy

db = 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:

1
pip install Flask-WTF

然后,创建一个表单文件 forms.py

1
2
3
4
5
6
7
8
9
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo

class 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, flash
from forms import RegistrationForm
from models import db, User
from werkzeug.security import generate_password_hash

app = 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 算法进行加密,增强了安全性。用户注册后会被重定向到登录页面,接下来我们将在下篇中实现用户登录功能。

如果你有任何问题或需要更多帮助,请随时提问!

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论