使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
简介:
在 Web 应用中,连接数据库是一项基本任务,而用户登录功能是很多应用的核心部分。本文将演示如何使用 Flask 框架连接数据库,并实现一个简单的用户登录功能。将创建一个名为 user 的数据库表,其中包含账号、密码和名字字段。还将实现一个登录页面,以及登录成功后跳转到的页面,显示用户姓名。
Flask项目创建参考这篇文章:通过命令行的方式快速创建一个flask项目
准备工作
首先,确保您已经安装了 Flask 和 SQLAlchemy,以及 MySQL 数据库。还需要安装 MySQL 的 Python 连接器,例如 pymysql。如果后面还报错,需要安装啥别的直接使用pip指令安装就可以了。
pip install Flask SQLAlchemy pymysql Flask-SQLAlchemy
- 创建数据库
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(80) UNIQUE NOT NULL, password VARCHAR(80) NOT NULL, name VARCHAR(80) NOT NULL );
创建 Flask 应用
创建一个名为 app.py 的 Python 文件,并编写以下代码:
from flask import Flask, render_template, request from flask_sqlalchemy import SQLAlchemy from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField, validators app = Flask(__name__) # 配置数据库连接信息和密钥 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost/db_name' app.config['SECRET_KEY'] = 'dsadsadjldajidsoajid' # 创建数据库实例 db = SQLAlchemy(app) # 定义用户模型类 class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password = db.Column(db.String(80), nullable=False) name = db.Column(db.String(80), nullable=False) # 定义登录表单 class LoginForm(FlaskForm): username = StringField('Username', validators=[validators.DataRequired()]) password = PasswordField('Password', validators=[validators.DataRequired()]) submit = SubmitField('Login') # 登录页面 @app.route('/', methods=['GET', 'POST']) def login(): form = LoginForm() message = None if form.validate_on_submit(): # 当提交表单且验证通过时 # 在数据库中查找用户 user = User.query.filter_by(username=form.username.data, password=form.password.data).first() if user: # 如果找到用户 # 渲染成功页面模板,并传递用户名作为参数 return render_template('success.html', username=user.username) else: message = 'Invalid username or password' # 渲染登录页面模板,并传递表单对象和消息 return render_template('login.html', form=form, message=message) # 添加用户 @app.route('/add_user', methods=['POST']) def add_user(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] name = request.form['name'] new_user = User(username=username, password=password, name=name) db.session.add(new_user) db.session.commit() return render_template('login.html') # 删除用户 @app.route('/delete_user/<int:user_id>', methods=['POST']) def delete_user(user_id): user = User.query.get_or_404(user_id) db.session.delete(user) db.session.commit() return render_template('login.html') # 编辑用户 @app.route('/edit_user/<int:user_id>', methods=['GET', 'POST']) def edit_user(user_id): user = User.query.get_or_404(user_id) if request.method == 'POST': user.username = request.form['username'] user.password = request.form['password'] user.name = request.form['name'] db.session.commit() return render_template('login.html') return render_template('edit_user.html', user=user) # 查询用户 @app.route('/users') def get_users(): users = User.query.all() return render_template('users.html', users=users) if __name__ == '__main__': # 在应用上下文中创建所有数据库表 with app.app_context(): # 创建所有数据库表 db.create_all() # 打印数据库连接成功信息 print("Database connection successful!") # 启动 Flask 应用 app.run(debug=True)
- 数据库密码的填写演示
模板是这样的mysql+pymysql://username:password@localhost/db_name
我的账号密码如果是root,123456 那么就这样写
mysql+pymysql://root:123456@localhost/db_name
- 在 app.config[‘SECRET_KEY’] 中,您可以填写一个用于 Flask 应用的密钥,以确保安全性。这个密钥可以是任何随机字符串,用于加密会话数据等。例如:
app.config['SECRET_KEY'] = 'dsadsadjldajidsoajid'
- 首先调试一下代码是否可以正常运行,可以正常启动,而且数据库连接成功了。
创建前端模板文件
以下是代码中所需的完整前端文件,他们放在templates文件夹中,包括登录页面(login.html)、成功页面(success.html)、编辑用户页面(edit_user.html)、用户列表页面(users.html):
login.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Login</title> </head> <body> <h1>Login</h1> <form method="POST" action="/"> {{ form.hidden_tag() }} <p>{{ form.username.label }}<br>{{ form.username(size=32) }}</p> <p>{{ form.password.label }}<br>{{ form.password(size=32) }}</p> <p>{{ form.submit() }}</p> </form> </body> </html>
success.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Login Success</title> </head> <body> <h1>Welcome, {{ username }}</h1> <p>You have successfully logged in.</p> </body> </html>
edit_user.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Edit User</title> </head> <body> <h1>Edit User</h1> <form method="POST" action="/edit_user/{{ user.id }}"> <p>Username: <input type="text" name="username" value="{{ user.username }}"></p> <p>Password: <input type="password" name="password" value="{{ user.password }}"></p> <p>Name: <input type="text" name="name" value="{{ user.name }}"></p> <p><input type="submit" value="Submit"></p> </form> </body> </html>
users.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>User List</title> </head> <body> <h1>User List</h1> <ul> {% for user in users %} <li>{{ user.username }} - {{ user.name }} <a href="/edit_user/{{ user.id }}">Edit</a></li> {% endfor %} </ul> </body> </html>
这些模板文件包含了登录、成功、编辑用户和用户列表页面的基本结构和表单。
- 运行结果展示