继续旅程:从头开始构建 Python Flask 和 MySQL Web 应用程序 – 第 2 部分

在本系列的前一部分中,我们了解了如何开始使用 python flask 和 mysql 并实现应用程序的用户注册部分。在本教程中,我们将通过为我们的应用程序实现登录和注销功能,将其提升到一个新的水平。

开始使用

首先从 GitHub 克隆上一个教程的源代码。

git clone https://github.com/tutsplus/create-a-web-app-from-scratch-using-python-flask-and-mysql/.git

克隆源代码后,导航到 part-1 目录并启动服务器。

python app.py

将浏览器指向 https://localhost:5000,应用程序应该正在运行。

创建登录界面

导航到FlaskApp/templates并创建一个名为signin.html的新文件。打开 signin.html 并添加以下 HTML 代码:

立即学习“Python免费学习笔记(深入)”;

        Python Flask Bucket List App - Sign In        
        
            Python Flask App                                

Bucket List App

        
            

© Company 2022

Designify
Designify

拖入图片便可自动去除背景✨

Designify 90
查看详情 Designify
        
    

打开app.py并为登录界面添加新路由。

@app.route('/signin')def showSignin():    return render_template('signin.html')

接下来,打开index.htmlsignup.html,并在两个页面上添加用于登录的 href 链接: /signin。保存所有更改并重新启动服务器。

python app.py

将浏览器指向 http://localhost:5000 并单击登录链接,您应该能够看到登录页面。

继续旅程:从头开始构建 Python Flask 和 MySQL Web 应用程序 - 第 2 部分

实现登录

现在,我们需要创建一个函数来验证用户登录。单击登录后,我们会将输入的电子邮件地址和密码发布到验证用户功能。

创建存储过程

为了验证用户,我们需要一个 MySQL 存储过程。因此创建一个MySQL存储过程如图:

DELIMITER $$CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_validateLogin`(IN p_username VARCHAR(20))BEGIN    select * from tbl_user where user_username = p_username;END$$DELIMITER ;

我们将使用 sp_validateLogin 从 MySQL 数据库中获取基于 用户名 的用户详细信息。获得哈希密码后,我们将根据用户输入的密码对其进行验证。

验证用户方法

创建一个方法来验证用户,我们将在用户提交表单时调用该方法:

@app.route('/api/validateLogin',methods=['POST'])def validateLogin():    try:        _username = request.form['inputEmail']        _password = request.form['inputPassword']    except Exception as e:        return render_template('error.html',error = str(e))

如上面的代码所示,我们已将发布的电子邮件地址和密码读取到 _username_password 中。现在我们将使用参数 _username 来调用 sp_validateLogin 过程。因此,在 validatelogin 方法内创建一个 MySQL 连接:

con = mysql.connect()

创建连接后,使用 con 连接创建 cursor

cursor = con.cursor()

使用游标,调用MySQL存储过程,如下所示:

cursor.callproc('sp_validateLogin',(_username,))

从游标中获取获取的记录,如下所示:

data = cursor.fetchall()

如果数据有一些记录,我们会将检索到的密码与用户输入的密码进行匹配。

if len(data) > 0:    if check_password_hash(str(data[0][3]),_password):        return redirect('/userhome')    else:        return render_template('error.html',error = 'Wrong Email address or Password.')else:    return render_template('error.html',error = 'Wrong Email address or Password.')

如上面的代码所示,我们使用了一个名为 check_password_hash 的方法来检查返回的哈希密码是否与用户输入的密码匹配。如果一切顺利,我们会将用户重定向到 userHome.html。如果出现任何错误,我们将显示 error.html 以及错误消息。

这是完整的 validateLogin 代码:

@app.route('/api/validateLogin',methods=['POST'])def validateLogin():    try:        _username = request.form['inputEmail']        _password = request.form['inputPassword']        # connect to mysql        con = mysql.connect()        cursor = con.cursor()        cursor.callproc('sp_validateLogin',(_username,))        data = cursor.fetchall()        if len(data) > 0:            if check_password_hash(str(data[0][3]),_password):                session['user'] = data[0][0]                return redirect('/userHome')            else:                return render_template('error.html',error = 'Wrong Email address or Password')        else:            return render_template('error.html',error = 'Wrong Email address or Password')    except Exception as e:        return render_template('error.html',error = str(e))    finally:        cursor.close()        con.close()

在 templates 文件夹中创建一个名为 userhome.html 的页面,并添加以下 HTML 代码:

        Python Flask Bucket List App - Home        
        
            Python Flask App                                

Welcome Home!

        
            

© Company 2022

        
    

此外,在 templates 文件夹中创建一个名为 error.html 的错误页面,并添加以下 HTML 代码:

        Error - Python Flask App        
        
            Python Flask App                                

{{error}}

        
            

© Company 2022

        
    

error.html 中,我们有一个元素,如下所示:

{{error}}

变量的值可以从 render_template 函数传递,并且可以动态设置。

成功登录后,我们将用户重定向到用户主页,因此我们需要创建一个名为 /userHome 的路由,如下所示:

@app.route('/userHome')def userHome():    return render_template('userHome.html')    

保存所有更改并重新启动服务器。单击主页上的登录链接,然后尝试使用有效的电子邮件地址和密码登录。成功的用户验证后,您应该看到如下所示的页面:

继续旅程:从头开始构建 Python Flask 和 MySQL Web 应用程序 - 第 2 部分

用户验证不成功时,用户将被重定向到错误页面,如下所示:

继续旅程:从头开始构建 Python Flask 和 MySQL Web 应用程序 - 第 2 部分

这里我们使用了一个单独的错误页面来显示错误。如果您想使用同一页面来显示错误消息也可以。

限制未经授权访问用户主页

用户验证成功后,用户将被重定向到用户主页。但现在,即使是未经授权的用户也可以通过简单地浏览 URL http://localhost:5000/userhome 来查看主页。

为了限制未经授权的用户访问,我们将检查会话变量,并在用户成功登录时设置该变量。因此从 Flask 导入 session

from flask import session

我们还需要为会话设置一个密钥。因此,在 app.py 中,在应用程序初始化后,设置密钥,如下所示:

app.secret_key = 'why would I tell you my secret key?'

现在,在 validateLogin 方法中,在成功登录后将用户重定向到 /userhome 之前,设置 session 变量,如下所示:

session['user'] = data[0][0]

接下来,在 userhome 方法内,在渲染 userhome.html 之前检查会话变量。如果未找到会话变量,则重定向到错误页面。

@app.route('/userhome')def userHome():    if session.get('user'):        return render_template('userhome.html')    else:        return render_template('error.html',error = 'Unauthorized Access')

保存所有更改并重新启动服务器。在不登录的情况下,尝试导航到 http://localhost:5000/userhome,由于您尚未登录,因此您应该被重定向到错误页面。

继续旅程:从头开始构建 Python Flask 和 MySQL Web 应用程序 - 第 2 部分

实现注销

实现注销功能是最简单的。我们需要做的就是将会话变量 user 设置为 null 并将用户重定向到主页。

app.py中,为 logout 创建一个新的路由和方法,如下所示:

@app.route('/logout')def logout():    session.pop('user',None)    return redirect('/')

我们已经将注销按钮的 href 设置为 /logout。因此,保存所有更改并重新启动服务器。在主页上,单击登录并尝试使用有效的电子邮件地址和密码登录。登录后,单击用户主页中的注销按钮,您应该会成功从应用程序注销。

结论

在本教程的这一部分中,我们了解了如何实现用户登录和注销功能。我们还了解了如何限制对应用程序页面的未经授权的访问。在本教程的下一部分中,我们将实现登录用户在应用程序中添加和编辑博客文章的功能。

这篇文章已根据 Jacob Jackson 的贡献进行了更新。 Jacob 是一名 Web 开发人员、技术作家、自由职业者和开源贡献者。

以上就是继续旅程:从头开始构建 Python Flask 和 MySQL Web 应用程序 – 第 2 部分的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1551484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
iframe之间靠什么链接
上一篇 2025年12月21日 21:46:07
当在JavaScript中将某个值转换为布尔值时会发生什么?
下一篇 2025年12月21日 21:46:39

相关推荐

  • 快兔网盘如何进行文件分类管理_快兔网盘文件分类管理技巧

    创建清晰的文件夹结构,按项目、部门等设主子文件夹,命名统一如“年月_项目名称”,层级不超过三层;2. 利用标签和备注功能标记文件状态与信息,提升搜索效率;3. 定期整理归档旧文件,清理无效数据,保持网盘整洁;4. 设置权限与共享目录,保障团队协作安全高效。 快兔网盘支持多种方式对文件进行高效分类管理…

    2026年8月31日
    000
  • 如何解决Laravel项目中邮件发送问题?使用s-ichikawa/laravel-sendgrid-driver可以!

    可以通过一下地址学习composer:学习地址 在开发laravel项目时,邮件发送功能是一个常见的需求。然而,配置和使用邮件服务有时会遇到各种问题,如无法发送邮件、配置复杂等。最近在处理一个项目时,我遇到了类似的问题,尝试了多种方法后,最终通过使用s-ichikawa/laravel-sendgr…

    用户投稿 2026年8月31日
    000
  • Laravel的强大功能和应用领域

    标题:Laravel的强大功能和应用领域 Laravel是一种流行的PHP框架,以其强大的功能和灵活性而闻名。它提供了许多功能和工具,使开发者能够更快速、更高效地构建复杂的Web应用程序。在本文中,将探讨Laravel的一些强大功能以及它在不同应用领域中的具体应用,同时会给出一些代码示例来说明其用法…

    2026年8月31日
    000
  • 酷睿 Ultra 9 搭配 RTX 4070 顶配 ROG 幻 Air 专业性能轻薄本首发开售

    酷睿 Ultra 9 搭配 RTX 4070 顶配 ROG 幻 Air 专业性能轻薄本首发开售酷睿 Ultra 9 搭配 RTX 4070 顶配 ROG 幻 Air 专业性能轻薄本首发开售酷睿 Ultra 9 搭配 RTX 4070 顶配 ROG 幻 Air 专业性能轻薄本首发开售酷睿 Ultra 9 搭配 RTX 4070 顶配 ROG 幻 Air 专业性能轻薄本首发开售

    最近,笔记本行业不断涌现高性能轻薄本,各大品牌之间展开新一轮竞争。对消费者而言,高性能轻薄本恰到好处地结合了性能与便携性,突显了用户对笔记本的极致需求。 在这其中,以 ROG 幻 Air 为代表的专业性能轻薄本率先拉开帷幕。据悉,此次 ROG 带来幻 16 Air 和幻 14 Air 两款产品,分别…

    2026年8月31日 用户投稿
    100
  • Laravel中的事件广播:实现实时通知和状态更新

    Laravel中的事件广播:实现实时通知和状态更新 引言:在现代的Web应用程序开发中,实时通知和状态更新成为越来越重要的需求。想象一下,在一个博客应用程序中,当有新的评论或者点赞时,我们希望即时地通知到用户,以提供更好的用户体验。Laravel框架提供了一个非常强大的功能来处理这个需求,那就是事件…

    2026年8月31日
    000
  • VSCode中怎么用Git_VSCode集成Git进行版本控制的基本操作教程

    首先确保Git和VSCode安装完成;初始化仓库用git init,修改文件后点击“+”暂存,输入提交信息后Ctrl+Enter提交;通过同步按钮推送或拉取代码;若Git路径未识别,在设置中手动配置git.path;创建或切换分支点击底部状态栏分支名操作;合并分支使用git merge命令,冲突时通…

    2026年8月31日
    600
  • mysql怎么查询慢的sql语句

    mysql怎么查询慢的sql语句mysql怎么查询慢的sql语句mysql怎么查询慢的sql语句mysql怎么查询慢的sql语句

    方法:1、若未开启慢查询,用“set global slow_query_log=’ON’;”开启慢;2、用“set global slow_query_log_file=路径”设置慢查询文件保存位置;3、用“subl 路径”查询文件即可。 本教程操作环境:centos 7系…

    2026年8月31日 用户投稿
    000
  • Laravel中Redis缓存优化技巧

    标题:优化Laravel中Redis缓存的技巧 在现代Web应用程序开发中,优化缓存是提高性能和响应速度的重要步骤之一。在Laravel框架中,Redis是一个常用的缓存驱动程序,可以有效地提升应用程序的性能。本文将介绍如何在Laravel中优化Redis缓存,以及一些实用的技巧和具体的代码示例。 …

    2026年8月31日
    000
  • Vue3组件路由切换后定时器未销毁?如何正确管理组件生命周期和定时器?

    Vue3组件及定时器:路由切换后的生命周期管理 本文探讨Vue3组件在路由切换后,定时器未销毁的问题,并提供有效的解决方案。 在Vue3开发中,妥善管理组件生命周期和定时器至关重要。 问题描述: 使用document.visibilitychange监听页面可见性,并用setInterval创建定时…

    2026年8月31日
    000
  • Win10关闭自动锁屏但是没有效果怎么办?

    Win10关闭自动锁屏但是没有效果怎么办?Win10关闭自动锁屏但是没有效果怎么办?Win10关闭自动锁屏但是没有效果怎么办?Win10关闭自动锁屏但是没有效果怎么办?

    windows 10 系统具备自动锁屏的功能,一旦用户有一段时间未操作,屏幕便会自动锁定。因此,不少用户想将其关闭。然而,有些用户表示自己按照设置后仍然无效,遇到这种情况该如何解决呢?接下来,让我们一起来看看具体的操作步骤吧! 实施步骤: 首先,进入系统的设置菜单,选择个性化选项。 在左侧导航栏中,…

    2026年8月31日 用户投稿
    000
  • 如何解决在线支付系统的开发难题?使用Composer可以轻松搞定!

    可以通过以下地址学习 Composer:学习地址 在开发在线支付系统时,与支付平台的集成是一个关键步骤。我最近在开发一个项目时,需要与 chargebee 支付平台对接,遇到了不少困难。首先,我尝试了手动集成 chargebee 的 api,但发现这不仅耗时费力,还容易出错。之后,我尝试了其他一些库…

    用户投稿 2026年8月31日
    100
  • 1688客户端如何查看我的足迹_1688客户端查看我的足迹浏览历史

    1688客户端查看足迹需进入个人中心点击“足迹”入口,浏览按时间倒序排列的商品记录,支持点击查看详情或编辑删除特定及全部历史。 1688客户端如何查看我的足迹?这是不少网友都关注的,接下来由PHP小编为大家带来1688客户端查看我的足迹浏览历史,感兴趣的网友一起随小编来瞧瞧吧! https://m.…

    2026年8月31日
    000
  • Unix / Linux如何配置文件和目录访问权限?

    unix和linux操作系统分别给三个组(所有者,组和其他用户)中的每一个分配三种访问类型(读取,写入和执行)中的一个来设置对文件和目录的访问权限。下面本篇文章就来带大家了解一下在unix / linux如何配置文件和目录访问权限,希望对大家有所帮助。 如何查看文件和目录访问权限? 我们可以使用带有…

    2026年8月31日
    100
  • 奔驰史上最大规模产品投放开启 多达36款产品将陆续发布

    奔驰集团发布未来三年宏伟新车计划:36款新车即将震撼上市! ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 奔驰集团在年度财报沟通会上宣布,将在2025年至2027年推出史无前例的36款新车型,旨在巩固其全球汽车市场领导地位。奔驰董事长康林松…

    2026年8月31日
    000
  • 诺基亚e71什么时间上市的(诺基亚e71上市时间和价格)

    php小编香蕉,你知道诺基亚e71什么时候上市的吗?诺基亚e71是一款被誉为商务界的“神器”的手机,其时尚的外观和实用的功能赢得了众多用户的青睐。这款手机于2008年6月份上市,目前市场上的二手价格一般在1000元左右。然而,尽管已经有了更加先进的手机和技术,诺基亚e71仍然有着不少粉丝,他们认为它…

    2026年8月31日
    000
  • mysql启动报错1067怎么办

    方法:1、在“my.ini”文件中,将“default-storage-engine”的内容修改为MYISAM;2、在MySQL目录下的data中删除“ib_logfile0”、“ib_logfile1”和ibdata1后重启数据库即可。 本教程操作环境:windows10系统、mysql8.0.2…

    2026年8月31日
    000
  • 深入比较Express和Laravel:如何选择最佳框架?

    深入比较Express和Laravel:如何选择最佳框架? 在选择一个适合自己项目的后端框架时,Express和Laravel无疑是两个备受开发者欢迎的选择。Express是基于Node.js的轻量级框架,而Laravel则是基于PHP的流行框架。本文将深入比较这两个框架的优缺点,并提供具体的代码示…

    2026年8月31日
    000
  • 图数据库能否完全取代关系型数据库?

    图数据库能否完全取代关系型数据库?这是一个值得深入探讨的问题。 传统项目通常依赖关系型数据库(如MySQL)满足数据存储需求。但随着项目复杂化和对数据关系分析需求的增长,图数据库逐渐受到关注。那么,图数据库能否完全替代关系型数据库,满足所有数据存储和访问需求呢? 答案并非绝对。这取决于项目的具体情况…

    2026年8月31日
    000
  • PHP file_get_contents 处理多URL请求的最佳实践

    本教程旨在解决PHP中处理多URL请求时常见的逻辑错误,特别是当从数据库查询结果生成URL并使用file_get_contents访问时。文章将揭示嵌套循环的陷阱,并提供一种高效、直接的迭代处理方法,确保每个URL被正确且仅访问一次,同时探讨性能、错误处理和URL编码等专业实践。 1. 问题背景与常…

    2026年8月31日
    000
  • [python]windows上通过whl文件安装numpy+mkl教程

    在windows系统中通过 .whl 文件安装 numpy+mkl ,可遵循以下步骤完成: 一、前期准备 下载对应版本的 .whl 文件:前往可信的Python第三方库镜像站点,例如 gitee.com/FIRC/pythonlibs_whl_mirror 。进入页面后按下 Ctrl+F 搜索关键词…

    2026年8月31日
    100

发表回复

登录后才能评论
关注微信