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

yizhihongxing

我来给你详细讲解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实现列表的排序方法分享

    Python实现列表的排序方法分享 在Python中,我们可以使用内置的sort()函数和sorted()函数来对列表进行排序。本攻略将介绍如何使用这两个函数对列表进行排序,并提供示例代码演示。 sort()函数 sort()函数是Python内置的列表排序函数,它可以对列表进行原地排序,即直接修改原列表。sort()函数有两个可选参数:reverse和ke…

    python 2023年5月13日
    00
  • python求众数问题实例

    下面是Python求众数问题的完整攻略: 什么是众数? 众数是指在一组数据中出现次数最多的数,例如在数列 1, 2, 3, 3, 3, 4, 4 中,众数是 3。在实际的数据处理过程中,求众数是一项非常常见的任务。 方法一:使用统计函数 Python中有统计函数可以直接帮我们求解众数。 from statistics import mode data = […

    python 2023年5月14日
    00
  • Python爬虫爬取属于自己的地铁线路图

    Python爬虫爬取属于自己的地铁线路图攻略 Python爬虫是一种自动化获取网页数据的技术,可以帮助我们快速地获取各种网站上的数据。本文将介绍如何使用Python爬虫爬取属于自己的地铁线路图,包括准备工作、爬虫流程、数据处理等内容,并提供两个示例。 准备工作 在使用Python爬虫之前,我们需要先安装一些必要的库。可以使用pip命令安装以下库: pip i…

    python 2023年5月15日
    00
  • Python解析nginx日志文件

    下面我将详细讲解“Python解析nginx日志文件”的完整攻略。 一、背景 nginx 是一款高性能的 Web 服务器软件,广泛应用于互联网中。而对于 nginx 服务器日志的处理也是非常重要的,通过分析日志可以了解访问量、访问方式、访问区域等信息,这些信息可以帮助我们更好地了解用户需求,优化网站架构,提高用户体验。 二、准备工作 在正式解析 nginx …

    python 2023年6月6日
    00
  • Python:在数据框列中将秒转换为日期时间格式

    【问题标题】:Python: Converting a seconds to a datetime format in a dataframe columnPython:在数据框列中将秒转换为日期时间格式 【发布时间】:2023-04-01 23:23:01 【问题描述】: 目前我正在使用一个大数据框 (12×47800)。十二列之一是由整数秒组成的列。我想…

    Python开发 2023年4月8日
    00
  • Python random模块(获取随机数)常用方法和使用例子

    Python random模块(获取随机数)常用方法和使用例子 随机数在计算机编程中被广泛应用,Python语言提供了random模块来生成随机数,可用于实现随机数组成、密码生成、数据加密、游戏开发等内容。 常用方法 Python的random模块提供了多种用于生成随机数的函数,常用的有以下几种: random() 此函数返回一个[0, 1)的随机浮点数。即…

    python 2023年5月14日
    00
  • Python for循环高级用法

    Python是一门简单、易学、高效的编程语言。其中的for循环语句是Python中最常用的循环语句之一。 在这篇文章中,我们将详细介绍Python的for循环及其用法。 Python for循环的基本语法 Python的for循环语法与其他编程语言中的for循环语法略有不同。在Python中,for循环语句的基本语法如下: for <variable&…

    2023年2月17日 Python流程控制
    00
  • python实现随机森林random forest的原理及方法

    简介: 随机森林(Random Forest)是一种集成学习(Ensemble Learning)方法,通过训练多个决策树,通过投票的方式来决定最终分类结果。它在机器学习中是一个非常常用的算法,尤其适用于分类问题。 下面是 Python 的实现随机森林的原理及方法的攻略: 随机森林的原理 随机森林的主要思想是,通过训练多个决策树来得到一个强大的集成学习模型。…

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