我来给你详细讲解Python实现的用户登录系统功能示例的完整攻略。
1. 系统功能介绍
在我们的用户登录系统中,我们需要实现以下功能:
- 用户注册:用户输入账号和密码,将其存入数据库中。
- 用户登录:用户输入账号和密码,系统进行验证,若验证成功则允许用户进入系统。
- 修改密码:用户可以在登录状态下修改密码。
2. 实现步骤
2.1 安装所需包
我们需要安装以下包来实现这个系统:
pip install flask
pip install sqlalchemy
pip install flask_sqlalchemy
flask
是一个 Web 开发框架,sqlalchemy
是一个 Python ORM 工具,flask_sqlalchemy
则是将这两者结合起来使用的工具。
2.2 数据库设计
我们需要一个数据表来存储用户账号和密码等信息。打开 MySQL 命令行,使用以下 SQL 命令来创建一个数据表:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.3 编写代码
我们需要编写以下代码文件:
app.py
:Web 应用程序入口文件,负责启动 Web 服务器、定义路由等逻辑。config.py
:应用程序的配置文件,包括数据库配置、调试模式等信息。models.py
:定义数据模型,包括用户模型和数据库操作等逻辑。templates/
:模板文件夹,包含 HTML 模板文件。static/
:静态文件夹,包含 CSS 和 JavaScript 等静态文件。
2.3.1 config.py
# -*- coding: utf-8 -*-
import os
# 配置信息
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'mysql+pymysql://root:password@localhost:3306/test'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = 'your-secret-key-goes-here'
DEBUG = True
SQLALCHEMY_DATABASE_URI
:数据库连接字符串,根据实际情况修改。SECRET_KEY
:用于加密会话密钥的字符串,可以随意指定。DEBUG
:是否启动调试模式,一般开启。
2.3.2 models.py
# -*- coding: utf-8 -*-
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), unique=True, nullable=False)
password = db.Column(db.String(100), nullable=False)
def __repr__(self):
return '<User %r>' % self.username
def verify_password(self, password):
return self.password == password
在这个文件中,我们定义了一个名为 User
的数据模型,包括 id
、username
、password
等属性,并定义了一个 verify_password
方法,用于验证用户密码。
2.3.3 app.py
# -*- coding: utf-8 -*-
from flask import Flask, request, render_template, session, redirect, url_for, flash
from models import db, User
from config import *
app = Flask(__name__)
# 加载配置
app.config.from_object('config')
db.init_app(app)
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
user = User.query.filter_by(username=username).first()
if user is not None and user.verify_password(password):
session['user_id'] = user.id
flash('登录成功')
return redirect(url_for('profile'))
else:
flash('登录失败')
return render_template('login.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
user = User(username=username, password=password)
db.session.add(user)
db.session.commit()
flash('注册成功')
return redirect(url_for('login'))
return render_template('register.html')
@app.route('/profile', methods=['GET', 'POST'])
def profile():
user_id = session.get('user_id')
if user_id is None:
return redirect(url_for('login'))
user = User.query.filter_by(id=user_id).first()
if request.method == 'POST':
old_password = request.form.get('old_password')
new_password = request.form.get('new_password')
if user.verify_password(old_password):
user.password = new_password
db.session.commit()
flash('修改密码成功')
else:
flash('密码错误')
return render_template('profile.html', user=user)
@app.route('/logout')
def logout():
session.pop('user_id', None)
return redirect(url_for('login'))
if __name__ == '__main__':
app.run()
在这个文件中,我们定义了四个路由函数,分别为:
/login
:用户登录界面,支持 GET 和 POST 请求。如果收到 POST 请求,则根据用户输入的用户名和密码从数据库中查询用户信息,并进行密码验证。如果验证成功,则将用户 id 存入 session 中,并跳转到/profile
页面,否则返回登录页面并显示错误信息。/register
:用户注册界面,支持 GET 和 POST 请求。如果收到 POST 请求,则将用户输入的用户名和密码存入数据库中,并跳转到/login
页面。/profile
:用户个人信息界面,需要登录才能访问。支持 GET 和 POST 请求。如果收到 POST 请求,则根据用户输入的旧密码和新密码来修改密码,反之则显示用户信息。/logout
:用户登出功能,清除 session 中的用户信息,并跳转到/login
页面。
2.3.4 templates/login.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<div class="wrapper">
<h1>用户登录</h1>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<form action="{{ url_for('login') }}" method="post">
<input type="text" name="username" placeholder="请输入账号"><br>
<input type="password" name="password" placeholder="请输入密码"><br>
<input type="submit" value="登录">
<a href="{{ url_for('register') }}">没有账号?点击注册</a>
</form>
</div>
</body>
</html>
这是用户登录页面的 HTML 模板文件。我们使用 {{ url_for('login') }}
和 {{ url_for('register') }}
来生成相应的表单处理地址。
2.3.5 templates/register.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<div class="wrapper">
<h1>用户注册</h1>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<form action="{{ url_for('register') }}" method="post">
<input type="text" name="username" placeholder="请输入账号"><br>
<input type="password" name="password" placeholder="请输入密码"><br>
<input type="submit" value="注册">
<a href="{{ url_for('login') }}">已有账号?点击登录</a>
</form>
</div>
</body>
</html>
这是用户注册页面的 HTML 模板文件。我们使用 {{ url_for('login') }}
来生成登录页面的链接地址。
2.3.6 templates/profile.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户个人信息</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<div class="wrapper">
<h1>用户个人信息</h1>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<p>欢迎您,{{ user.username }}!</p>
<form action="{{ url_for('profile') }}" method="post">
<input type="password" name="old_password" placeholder="请输入旧密码"><br>
<input type="password" name="new_password" placeholder="请输入新密码"><br>
<input type="submit" value="修改密码">
</form>
<a href="{{ url_for('logout') }}">退出账号</a>
</div>
</body>
</html>
这是用户个人信息页面的 HTML 模板文件。我们使用 {{ user.username }}
来显示当前用户的用户名,并使用 {{ url_for('logout') }}
来生成退出账号链接。
2.4 运行应用程序
将以上文件存储到同一文件夹中,然后执行 python app.py
命令启动应用程序,打开浏览器访问 http://127.0.0.1:5000
,即可看到登录页面。
3. 示例说明
3.1 用户注册
用户访问 /register
页面,输入用户名和密码,提交表单进行注册。系统将用户名和密码存入数据库中,并跳转到 /login
页面。
3.2 用户登录
用户访问 /login
页面,输入正确的用户名和密码,提交表单进行登录。系统验证用户名和密码,若验证成功则将用户 id 存入 session 中,并跳转到 /profile
页面,否则返回登录页面并显示错误信息。
以上是Python实现的用户登录系统功能的完整攻略,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现的用户登录系统功能示例 - Python技术站