Python实现的用户登录系统功能示例

我来给你详细讲解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 的数据模型,包括 idusernamepassword 等属性,并定义了一个 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技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • python通过cython加密代码

    使用Cython对Python代码进行加密是一种保护Python代码的方法。下面是完整的攻略和两个示例。 工具和材料 Python环境 Cython pyximport库 步骤 安装Cython和pyiximport Cython是Python的C语言扩展,需要安装。可以使用以下命令安装: pip install Cython pyximport是能够自动将…

    python 2023年6月3日
    00
  • Python中的Function定义方法第1/2页

    下面是“Python中的Function定义方法”的完整攻略。 1. Function基础 1.1 什么是Function? 函数(Function)是一组可执行的代码块,用于完成特定的任务。Function是被封装的代码,可以接收参数并返回结果。 在Python中,一个函数通常由以下几部分组成: def function_name(parameters):…

    python 2023年6月5日
    00
  • python 基于DDT实现数据驱动测试

    python基于DDT实现数据驱动测试 数据驱动测试是指用数据来推动测试执行,高效地测试大量不同的数据组合和多样化场景。在测试中,我们需要构建复杂数据结构,去测试不同条件下的代码正确性或者服务功能是否正确。而这就需要针对不同情况运行测试,数据驱动测试的方式,就可以有效地解决这些问题。 Python是一种简单易学但十分强大的编程语言,因其简洁优雅、易读易写、开…

    python 2023年5月13日
    00
  • 详解Python的单元测试

    详解Python的单元测试 在Python中,单元测试是一种测试方法,用于测试代码的各个部分是否按照预期工作。本文将为您详细讲解Python的单元测试,包括何定义和使用单测试,并提供两个示例说明。 单元测试的基本概念 单元测试是指对代码中的最小可测试单元进行测试,通常是函数或方法。单元测试的目的是确保每个单元都按照期工作,并且在修改代码不会破坏现有的功能。以…

    python 2023年5月14日
    00
  • Python入门教程(三十七)Python中的删除文件

    Python中的删除文件 在Python中,使用os模块中的remove()函数来删除文件。os.remove()函数可以删除指定路径下的文件。 语法格式 os.remove(path) path:要删除的文件的路径 示例说明 下面是两个示例说明,帮助读者更好地理解如何使用os.remove()函数来删除文件。 示例一 删除文件/tmp/test.txt: …

    python 2023年6月2日
    00
  • python3中set(集合)的语法总结分享

    Python3中的set(集合)是一个无序、不重复元素的集合。集合类似于列表或元组,但是不允许有重复的元素。 语法总结 创建集合 可以使用花括号{}或内置函数set()来创建集合。 # 使用花括号创建集合 set1 = {1, 2, 3, 4, 5} # 使用内置函数set()创建集合 set2 = set([5, 6, 7, 8, 9]) 集合操作 添加元…

    python 2023年5月13日
    00
  • Python中非常实用的一些功能和函数分享

    Python中非常实用的一些功能和函数分享 Python是一种功能强大的编程语言,提供了很多实用的功能和函数,可以帮助我们更高效地完成编程任务。以下是一些非常实用的功能和函数分享: 1. 字符串拼接 字符串拼接是一种常见的操作,Python提供了多种方法实现字符串拼接,如下所示: 1.1 使用”+”号 name = "Alice" age…

    python 2023年5月19日
    00
  • 用python做个代码版的小仙女蹦迪视频

    下面是用Python制作代码版小仙女蹦迪视频的详细攻略: 一、需要的工具和库 Python 3.x MoviePy 库 二、基本流程 导入需要用到的库 设置需要用到的变量 加载视频资源 处理视频 输出结果 三、具体实现 1. 导入需要用到的库 from moviepy.editor import * 2. 设置需要用到的变量 input_video_path…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部