用pycharm的flsak框架编写用户登录注册具体代码并连接数据库
时间: 2023-12-03 18:46:33 浏览: 156
好的,首先你需要安装 Flask 和 Flask-WTF(用于表单验证) 以及 Flask-MongoEngine(用于连接 MongoDB 数据库)。
在 PyCharm 中创建一个 Flask 项目,然后在终端中执行以下命令来安装所需的包:
```
pip install Flask
pip install Flask-WTF
pip install Flask-MongoEngine
```
接下来,我们需要创建一个 MongoDB 数据库。你可以在 MongoDB 官网上下载并安装 MongoDB,或者使用云数据库服务比如 MongoDB Atlas。创建一个名为 `flask_app` 的数据库,并在其中创建一个名为 `users` 的集合,用于存储用户数据。
接下来,我们将编写以下代码:
```python
from flask import Flask, render_template, flash, redirect, url_for
from flask_mongoengine import MongoEngine
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, EqualTo
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key' # 设置一个密钥用于表单验证
app.config['MONGODB_SETTINGS'] = {
'db': 'flask_app',
'host': 'localhost',
'port': 27017
}
db = MongoEngine(app) # 连接到 MongoDB 数据库
class User(db.Document):
email = db.StringField(required=True, unique=True)
password = db.StringField(required=True)
class RegistrationForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Length(max=50)])
password = PasswordField('Password', validators=[DataRequired(), Length(min=6)])
confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('Sign Up')
class LoginForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Length(max=50)])
password = PasswordField('Password', validators=[DataRequired(), Length(min=6)])
submit = SubmitField('Log In')
@app.route('/', methods=['GET', 'POST'])
def index():
return render_template('index.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(email=form.email.data, password=form.password.data)
user.save()
flash('Account created successfully!', 'success')
return redirect(url_for('login'))
return render_template('register.html', form=form)
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.objects(email=form.email.data).first()
if user and user.password == form.password.data:
flash('Logged in successfully!', 'success')
return redirect(url_for('index'))
else:
flash('Invalid email or password.', 'danger')
return render_template('login.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
```
上面的代码定义了两个表单类 `RegistrationForm` 和 `LoginForm` 分别用于用户注册和登录。在 `User` 类中定义了 `email` 和 `password` 字段,用于存储用户数据,同时设置了 `required=True` 表示这两个字段是必需的,`unique=True` 表示 `email` 字段必须唯一。
在 `register` 路由函数中,如果表单验证通过,我们将创建一个 `User` 对象并保存到数据库中,然后跳转到登录页面。在 `login` 路由函数中,我们首先查询数据库中是否存在该用户,如果存在并且密码也正确,则跳转到首页,否则显示错误消息。
最后,我们需要创建三个 HTML 模板文件 `index.html`、`register.html` 和 `login.html` 分别用于显示首页、注册页面和登录页面。这些模板文件的代码如下:
`index.html`:
```html
<!DOCTYPE html>
<html>
<head>
<title>Flask App</title>
</head>
<body>
<h1>Welcome to Flask App!</h1>
</body>
</html>
```
`register.html`:
```html
<!DOCTYPE html>
<html>
<head>
<title>Register</title>
</head>
<body>
<h1>Register</h1>
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message[1] }}">{{ message[0] }}</div>
{% endfor %}
{% endif %}
{% endwith %}
<form method="post">
{{ form.hidden_tag() }}
<div>
{{ form.email.label }}<br>
{{ form.email(size=50) }}<br>
{% for error in form.email.errors %}
<span style="color: red;">{{ error }}</span><br>
{% endfor %}
</div>
<div>
{{ form.password.label }}<br>
{{ form.password }}<br>
{% for error in form.password.errors %}
<span style="color: red;">{{ error }}</span><br>
{% endfor %}
</div>
<div>
{{ form.confirm_password.label }}<br>
{{ form.confirm_password }}<br>
{% for error in form.confirm_password.errors %}
<span style="color: red;">{{ error }}</span><br>
{% endfor %}
</div>
<div>
{{ form.submit }}
</div>
</form>
</body>
</html>
```
`login.html`:
```html
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Login</h1>
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message[1] }}">{{ message[0] }}</div>
{% endfor %}
{% endif %}
{% endwith %}
<form method="post">
{{ form.hidden_tag() }}
<div>
{{ form.email.label }}<br>
{{ form.email(size=50) }}<br>
{% for error in form.email.errors %}
<span style="color: red;">{{ error }}</span><br>
{% endfor %}
</div>
<div>
{{ form.password.label }}<br>
{{ form.password }}<br>
{% for error in form.password.errors %}
<span style="color: red;">{{ error }}</span><br>
{% endfor %}
</div>
<div>
{{ form.submit }}
</div>
</form>
</body>
</html>
```
现在你可以运行该应用程序并在浏览器中访问 `http://localhost:5000/` 来查看效果。
阅读全文