flask实现用户登录注册
时间: 2023-09-05 12:13:43 浏览: 40
好的,下面是一个基本的 Flask 用户登录注册的实现:
首先,我们需要安装 Flask 和 Flask-WTF 库:
```
pip install flask
pip install flask-wtf
```
接下来,创建一个名为 app.py 的文件,在其中导入 Flask 和 Flask-WTF:
```
from flask import Flask, render_template, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, Email, EqualTo
```
然后,我们需要配置 Flask 应用:
```
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
```
在这里,我们设置了一个密钥,用于加密表单数据。
接下来,我们需要创建一个名为 User 的类,用于存储用户信息:
```
class User:
def __init__(self, username, email, password):
self.username = username
self.email = email
self.password = password
```
然后,我们需要创建一个列表,用于存储用户信息:
```
users = []
```
现在,我们可以创建注册表单和登录表单了。首先,创建一个名为 RegistrationForm 的类,用于注册表单:
```
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired(), Length(min=6)])
confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('Sign Up')
```
在这里,我们使用了 WTForms 库中的 StringField、PasswordField 和 SubmitField 类。其中,StringField 用于输入文本,PasswordField 用于输入密码,SubmitField 用于提交表单。
接着,创建一个名为 LoginForm 的类,用于登录表单:
```
class LoginForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Login')
```
现在,我们可以创建注册和登录的路由了。首先,创建一个名为 register 的路由,用于展示注册表单和处理注册表单提交:
```
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
username = form.username.data
email = form.email.data
password = form.password.data
user = User(username, email, password)
users.append(user)
return redirect(url_for('login'))
return render_template('register.html', form=form)
```
在这里,我们首先创建了一个 RegistrationForm 的实例,用于展示表单。然后,我们使用 validate_on_submit() 方法检查表单是否提交,并且通过 form 对象的 data 属性获取表单数据。接着,我们创建一个 User 对象,并将其添加到 users 列表中。最后,我们重定向到登录页面。
接下来,创建一个名为 login 的路由,用于展示登录表单和处理登录表单提交:
```
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
email = form.email.data
password = form.password.data
for user in users:
if user.email == email and user.password == password:
return redirect(url_for('home'))
return render_template('login.html', form=form)
```
在这里,我们首先创建了一个 LoginForm 的实例,用于展示表单。然后,我们使用 validate_on_submit() 方法检查表单是否提交,并且通过 form 对象的 data 属性获取表单数据。接着,我们遍历 users 列表,查找与表单数据匹配的用户。如果找到了用户,我们重定向到主页。
最后,我们需要创建一个名为 home 的路由,用于展示用户登录后的主页:
```
@app.route('/home')
def home():
return 'Welcome to the home page!'
```
现在,我们可以创建两个 HTML 模板,用于展示注册表单和登录表单。在 templates 目录下创建一个名为 register.html 的文件:
```
{% extends 'base.html' %}
{% block content %}
<h1>Sign Up</h1>
<form method="POST">
{{ form.hidden_tag() }}
<div>
{{ form.username.label }} {{ form.username }}
{% for error in form.username.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<div>
{{ form.email.label }} {{ form.email }}
{% for error in form.email.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<div>
{{ form.password.label }} {{ form.password }}
{% for error in form.password.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<div>
{{ form.confirm_password.label }} {{ form.confirm_password }}
{% for error in form.confirm_password.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<div>{{ form.submit }}</div>
</form>
{% endblock %}
```
在这里,我们使用了 Flask 中的模板引擎 Jinja2。首先,我们继承了一个名为 base.html 的基本模板。然后,我们使用 {{ }} 标记来渲染表单元素和错误信息。
接下来,创建一个名为 login.html 的文件:
```
{% extends 'base.html' %}
{% block content %}
<h1>Login</h1>
<form method="POST">
{{ form.hidden_tag() }}
<div>
{{ form.email.label }} {{ form.email }}
{% for error in form.email.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<div>
{{ form.password.label }} {{ form.password }}
{% for error in form.password.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<div>{{ form.submit }}</div>
</form>
{% endblock %}
```
在这里,我们也继承了基本模板,并使用了 {{ }} 标记来渲染表单元素和错误信息。
最后,创建一个名为 base.html 的文件,作为所有模板的基本模板:
```
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
```
在这里,我们定义了基本的 HTML 结构,并使用了 Jinja2 标记来渲染模板内容。
现在,我们已经完成了 Flask 用户登录注册的实现。
相关推荐
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)