Flask是一款轻量级的Web框架,非常方便快捷。MySQL则是一款常用的数据库,两者结合可以实现很多有趣的项目。本文将介绍如何使用Flask和MySQL实现用户注册、登录和登出功能的项目实践。
准备工作
在开始项目之前,我们需要准备一些工具和环境:
- Python环境:Flask是Python编写的Web框架,我们首先需要安装Python环境。
- Flask框架:我们需要安装Flask框架,可以通过pip命令进行安装:
pip install flask
。 - MySQL数据库:我们需要安装MySQL数据库,并创建数据库和数据表以存储用户信息。
- PyMySQL库:我们需要使用PyMySQL库来连接并操作MySQL数据库,可以通过pip命令进行安装:
pip install pymysql
。
用户注册
用户注册功能是项目的第一步,我们需要先实现它。以下是Flask + MySQL实现用户注册的方法:
创建注册页面模板(register.html)
我们先创建一个包含注册表单的HTML文件,用于显示注册页面。可以使用Flask自带的Jinja2模板引擎渲染页面。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<h1>用户注册</h1>
<form method="POST" action="{{ url_for('register') }}">
<p>
<label>用户名: <input type="text" name="username"></label>
</p>
<p>
<label>密码: <input type="password" name="password"></label>
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
</body>
</html>
该页面包含一个用户名和密码的表单,当用户点击提交按钮时,会将表单数据提交给服务器的/register路由。
创建注册路由(/register)
接下来我们需要创建一个/register的路由,用于处理用户提交的表单数据并将其存储到数据库中。以下是实现代码:
from flask import Flask, render_template, request, redirect, url_for
import pymysql
app = Flask(__name__)
# 数据库连接信息
db_config = {
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': 'password',
'db': 'testdb'
}
# 注册路由
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'GET':
return render_template('register.html')
else:
username = request.form['username']
password = request.form['password']
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
try:
# 判断用户名是否已存在
sql = """SELECT * FROM users WHERE username=%s"""
cursor.execute(sql, (username,))
result = cursor.fetchone()
if result:
return "用户名已存在,请重新输入"
# 插入用户数据
sql = """INSERT INTO users (username, password) VALUES (%s, %s)"""
cursor.execute(sql, (username, password))
conn.commit()
return "注册成功"
except:
conn.rollback()
return "注册失败"
finally:
cursor.close()
conn.close()
当用户提交表单时,我们通过request.form获取表单数据,然后连接MySQL数据库,根据用户名判断该用户是否已经存在,如果不存在则将用户数据插入数据库中。
运行应用程序
现在我们已经完成了用户注册功能,可以运行应用程序并打开网址http://localhost:5000/register进行测试。
if __name__ == '__main__':
app.run(debug=True)
用户登录
用户登录是项目的第二步,我们需要让用户输入用户名和密码,并验证其登录信息。以下是Flask + MySQL实现用户登录的方法:
创建登录页面模板(login.html)
我们先创建一个包含登录表单的HTML文件,用于显示登录页面。可以使用Flask自带的Jinja2模板引擎渲染页面。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
<form method="POST" action="{{ url_for('login') }}">
<p>
<label>用户名: <input type="text" name="username"></label>
</p>
<p>
<label>密码: <input type="password" name="password"></label>
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
</body>
</html>
该页面包含一个用户名和密码的表单,当用户点击提交按钮时,会将表单数据提交给服务器的/login路由。
创建登录路由(/login)
接下来我们需要创建一个/login的路由,用于验证用户提交的表单数据是否正确。以下是实现代码:
# 登录路由
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
username = request.form['username']
password = request.form['password']
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
try:
# 查询用户数据
sql = """SELECT * FROM users WHERE username=%s AND password=%s"""
cursor.execute(sql, (username, password))
result = cursor.fetchone()
if result:
# 验证通过,设置用户会话
session['username'] = username
return redirect(url_for('index'))
else:
return "用户名或密码错误"
except:
return "登录失败"
finally:
cursor.close()
conn.close()
当用户提交表单时,我们通过request.form获取表单数据,然后连接MySQL数据库,根据用户名和密码查询用户数据。如果查询结果存在,则表示验证通过,设置用户会话并将页面重定向到首页;如果查询结果不存在,则表示验证失败,显示错误信息。
创建会话
我们需要使用Flask内置的session来管理用户会话。需要提前设置一个密钥app.secret_key,否则会抛出异常。
app.secret_key = 'my_secret_key'
定义首页(/)
我们需要定义一个首页,用于检查用户是否已经登录。以下是实现代码:
# 主页路由
@app.route('/')
def index():
username = session.get('username')
if username is not None:
return "欢迎 " + username + " 登录"
else:
return redirect(url_for('login'))
该路由会检查当前用户是否已经登录。如果已经登录,则显示欢迎页面,否则将页面重定向到登录页面。
运行应用程序
现在我们已经完成了用户登录功能,可以运行应用程序并打开网址http://localhost:5000/login进行测试。
if __name__ == '__main__':
app.run(debug=True)
用户登出
用户登出是项目的最后一步,我们需要让用户退出登录,并清除用户会话。以下是Flask + MySQL实现用户登出的方法:
创建登出路由(/logout)
我们需要创建一个/logout的路由,用于清除用户会话。以下是实现代码:
# 退出登录路由
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('login'))
该路由会清除用户会话,并将页面重定向到登录页面。
修改首页
我们需要修改首页,添加一个退出登录的链接。以下是实现代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
{% if username %}
<h1>欢迎 {{ username }} 登录</h1>
<p><a href="{{ url_for('logout') }}">退出登录</a></p>
{% else %}
<p>请先 <a href="{{ url_for('login') }}">登录</a></p>
{% endif %}
</body>
</html>
该页面会根据用户是否已经登录,动态显示不同内容。如果用户已经登录,则显示欢迎信息和退出登录链接;否则显示提示信息和登录链接。
运行应用程序
现在我们已经完成了用户登出功能,可以运行应用程序并打开网址http://localhost:5000/进行测试。
if __name__ == '__main__':
app.run(debug=True)
到这里,我们已经完成了Flask + MySQL实现用户注册、登录和登出的项目实践。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask + MySQL如何实现用户注册,登录和登出的项目实践 - Python技术站