基于flask的web应用开发——登录界面

news2024/11/24 2:02:59

目录

  • 0. 前言
  • 1. request
  • 2. redirect
  • 3. 动态路由
  • 4. Jinja2
  • 代码实现

0. 前言

打算在云服务器上部署一个 TODO LIST 来练手,也就是一个代办事项提醒表。

本节学习使用 flask 库制作出一个登录界面,并且使用Redis数据库实现账号密码加载功能,关于注册界面我们下次再加上。

注意!!!请确保你安装了 redis 数据库,否则会因为无法登录数据库而报错。

这节的芝士点如下:

  • request 对象
  • redirect 重定向
  • 动态路由
  • Jinja2 模板

操作系统:Windows10 家庭版

开发环境:Pycahrm Comunity 2022.3

Python解释器版本:Python3.8

第三方库:flask,redis

1. request

request是Flask框架中的一个全局变量,用于在视图函数中获取客户端请求中的数据和属性。

其类型为flask.request,包含HTTP请求的各种属性和方法,例如请求方法、URL、表单数据、文件数据、请求头等。

例如你想获取用户名和密码,在浏览器中输入以后点击Login进行POST请求提交表单:
在这里插入图片描述
那么在代码中应该使用以下代码获取登录信息

···
request.form["username"] # 获取用户名
request.form["password"] # 获取密码
····

你也可以使用这个来获取请求方式

···
if request.method == 'POST':
···

2. redirect

redirect是Flask框架中的一个函数,用于重定向用户浏览器到其他URL或视图函数。

例如,完成登录后应该要跳转到另一个界面,这个跳转是如何实现的呢?用到的就是重定向:

···
# 跳转到/user/username
return redirect("/user/{}".format(request.form["username"]))
···
···
@app.route('/user/<username>', methods=['GET', 'POST'])
def todo_list(username):
	# 处理事件
	···
···

在这里插入图片描述

3. 动态路由

这段代码实现了动态路由功能,例如你是以 IoT_H2 的身份登录,那么将是以下这样:
在这里插入图片描述

现在我在Redis数据库中新建另一个用户
在这里插入图片描述
用户名设置为 H2,密码设置123456

登录以后则是这样,问候语发生了变化:
在这里插入图片描述

# 任务列表,在后期应设置为每个用户专用的列表
tasks = []
@app.route('/user/<username>', methods=['GET', 'POST'])
def todo_list(username):
    global tasks

    # 收到post请求则提交表单,添加代办任务
    if request.method == 'POST':
        task = request.form['task']
        tasks.append(task)

    # 收到GET请求则判断是否收到删除操作
    elif request.method == 'GET':
        delete_task = request.args.get('delete_task')
        # 删除任务操作
        if delete_task in tasks:
            tasks.remove(delete_task)

    # 不管什么请求,结束后都动态刷新页面
    return render_template('todo.html', tasks=tasks,username = username)

4. Jinja2

Jinja2是一个流行的Python模板引擎,被广泛应用于Flask和Django等Web框架中。Jinja2模板引擎支持多种语法和语言扩展,包括控制流、变量替换、模板继承、过滤器等功能。

其实就是可以在其中写类似Python命令的一种规则,后缀名依旧是html。

下面是一个举例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    {% for item in items %}
        <div>{{ item }}</div>
    {% endfor %}
</body>
</html>

title 和 items 都是我们使用 render_template 传递进去的参数。

在这里插入图片描述

不理解也没关系,整理好最后的工程然后阅读几遍即可:

代码实现

注释我都写在了代码之中:

from flask import Flask, render_template,request,redirect
import redis

app = Flask(__name__)

# 连接 Redis 数据库
r = redis.Redis(host='127.0.0.1', port=6379,charset='utf-8', decode_responses=True)

def LoginTest(a,b):
    if a == b:
        return True
    else:
        return False

# 不管是/login 还是/ 都会进入到登录界面
@app.route('/')
@app.route('/login', methods=['GET', 'POST'])
def login():
    # 收到的是POST请求
    if request.method == 'POST':
        # 处理登录表单提交的数据
        # 与数据库比对登录信息,密码正确则重定向至用户界面
        if LoginTest(request.form["password"],r.get(request.form["username"])):
            print("Login Sucessfully")
            return redirect("/user/{}".format(request.form["username"]))
        # 密码错误
        else:
            return "ERROR PASSWD"
    # 只能收到POST和GET请求,不是POST则是GET,返回登录界面
    else:
        # 显示登录表单页面
        return render_template('login.html')

# 任务列表,在后期应设置为每个用户专用的列表
tasks = []
@app.route('/user/<username>', methods=['GET', 'POST'])
def todo_list(username):
    global tasks
    
    # 收到post请求则提交表单,添加代办任务
    if request.method == 'POST':
        task = request.form['task']
        tasks.append(task)
        
    # 收到GET请求则判断是否收到删除操作
    elif request.method == 'GET':
        delete_task = request.args.get('delete_task')
        # 删除任务操作
        if delete_task in tasks:
            tasks.remove(delete_task)
    
    # 不管什么请求,结束后都动态刷新页面
    return render_template('todo.html', tasks=tasks,username = username)


if __name__ == '__main__':
    # 0.0.0.0代表广播地址,同一局域网的用户都能访问
    # 端口号为5000,设置为专用端口(如80)需要管理员身份
    app.run(host = "0.0.0.0", port = 5000)

todo.html

<!DOCTYPE html>
<html>
<head>
    {% if username %} {# 如果传递了username参数,那么将选项卡标签为 To Do List, username #}
        <title>To Do List, {{ username }}</title>
    {% else %} {# 否则只显示To Do List #}
        <title>To Do List</title>
    {% endif %} {# 用完了if语句要endif #}
</head>
<body>
    {% if username %}
        <h1>To Do List, {{ username }}</h1>
    {% else %}
        <h1>To Do List, user</h1>
    {% endif %}

    {% if tasks %}
        <ul>
        {% for task in tasks %}
            <li>{{ task }}
                <a href="?delete_task={{ task }}">[X]</a>
            </li>
        {% endfor %}
        </ul>
    {% else %}
        <p>No tasks yet!</p>
    {% endif %}
    <form method="POST">
        <input type="text" name="task" placeholder="Enter a new task...">
        <input type="submit" value="Add">
    </form>
</body>
</html>

login.html

<!DOCTYPE html>
<html>
<head>
	<title>Login</title>
</head>
<body>
	<h1>Login</h1>
	<form method="POST" action="/login">
		<label>Username:</label>
		<input type="text" name="username"><br><br>
		<label>Password:</label>
		<input type="password" name="password"><br><br>
		<input type="submit" value="Login">
	</form>
</body>
</html>

如果发生报错:

    1. 检查Redis数据库启动情况
    1. 检查目录结构
    1. 检查端口是否开放
    1. 检查第三方库安装情况
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序登录的最佳实践

微信小程序登录的最佳实践 官方文档的介绍 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识&#xff0c;快速建立小程序内的用户体系。 登录流程时序 说明 调用 wx.login() 获取 临时登录凭证code &#xff0c;并回传到开发者服务器。 调用 auth.co…

图解C++对象模型

C对象模型是什么 《深度探索C对象模型》这本书中对对象模型的描述如下&#xff1a; 有两个概念可以解释C对象模型&#xff1a; 语言中直接支持面向对象程序设计的部分。 对于各种支持的底层实现机制。 语言中直接支持面向对象程序设计的部分&#xff0c;包括了构造函数、析构函…

chatgpt赋能python:Python如何快速复制上一行?

Python 如何快速复制上一行&#xff1f; 在编写Python代码时&#xff0c;经常需要快速复制上一行代码进行修改。如果只是简单的手动复制粘贴&#xff0c;会造成不必要的时间浪费并且容易出错。本文将介绍三种快速复制上一行代码的方法。 方法一&#xff1a;使用快捷键 在Pyt…

chatgpt赋能python:Python如何拟合曲线

Python如何拟合曲线 拟合曲线是数据分析中常见的一种方法。Python作为一种强大的编程语言&#xff0c;具有丰富的数据分析库和拟合曲线的功能。本文将介绍如何在Python中使用numpy、matplotlib和scipy库进行曲线拟合。 numpy库 numpy是Python中常用的数值计算库。它提供了许…

Error系列-CVE CIS-2023系统漏洞处理方案集合

问题1&#xff1a; CVE-2023-29491 Type: OS涉及到的包&#xff1a;ncurses-dev,ncurses-libs,ncurses-terminfo-base描述&#xff1a;当前系统安装的ncurses&#xff0c;存在漏洞&#xff0c;当被setuid应用程序使用时&#xff0c;允许本地用户通过在$HOME/中找到的终端数据库…

Spring Cloud Alibaba - Sentinel(二)

目录 一、Sentinel 熔断降级简介 1、基本介绍 2、熔断策略 3、熔断规则 二、Sentinel熔断策略 1、慢调用比例 2、异常比例 3、 异常数 三、热点规则 1、热点规则 2、参数例外项 四、系统规则 1、Sentinel 系统规则 一、Sentinel 熔断降级简介 1、基本介绍 除了流…

Linux 手动部署 SpringBoot 项目

Linux 手动部署 SpringBoot 项目 1. 将项目打包成 jar 包 &#xff08;1&#xff09;引入插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></pl…

【Spring 项目的创建和使用】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. 创建 Spring 项目 2. 创建一个 普通 Maven…

chatgpt赋能python:Python如何更新pip

Python 如何更新 pip 在 Python 编程中&#xff0c;pip 是一个非常重要的工具&#xff0c;它可以帮助我们安装和管理 Python 包。然而&#xff0c;我们有时候会遇到 pip 版本过低&#xff0c;需要进行更新的情况。那么&#xff0c;如何更新 pip 呢&#xff1f; 什么是 pip p…

论文笔记(三十):Counter-Hypothetical Particle Filters for Single Object Pose Tracking

Counter-Hypothetical Particle Filters for Single Object Pose Tracking 文章概括摘要1. 简介II. 相关工作A. 机器人的物体姿态估计和跟踪B. 鲁棒性的粒子滤波 III. 背景&#xff1a;粒子滤波A. 粒子滤波B. 粒子剥夺和粒子重振IV. 反假设粒子滤波A. 反假设重取样B. 6D姿势估计…

记一次为学校流浪猫开发的小程序——航海之猫

某次刷朋友圈时&#xff0c;看到校园墙上有一个校园流浪猫救助组织在召集爱心人士加入工作小组。其中需要会做微信小程序的给学校里的猫猫做一个猫猫图鉴&#xff0c;于是就有了本次项目经历。 相关技术及工具 工具&#xff1a;Uniapp、XBuilder、微信官方开发者工具技术&…

chatgpt赋能python:Python如何把文件复制到另一个目录下

Python如何把文件复制到另一个目录下 作为一个有着10年Python编程经验的工程师&#xff0c;我可以告诉你&#xff0c;在Python编程中&#xff0c;复制文件是非常常见的任务之一。无论您是为了备份数据或将文件从一个地方传输到另一个地方&#xff0c;都需要使用文件复制操作。…

Linux中/dev/null和/dev/zero的作用

1./dev/null和/dev/zero介绍 在Linux环境中&#xff0c;我们会经常用到/dev/null和/dev/zero&#xff0c;今天为大家讲讲/dev/null和/dev/zero的作用以及使用场景。 1.1./dev/null介绍 linux中/dev/null&#xff0c;它是一种特殊的虚拟设备&#xff0c;用于写入而不是读取&a…

前端050_单点登录SSO_登录功能实现

登录功能实现 1、登录认证流程2、定义 Api 调用登录接口3、Vuex 登录信息状态管理4、提交登录触发 action5、测试1、登录认证流程 单点登录认证流程图 门户客户端要求登录时,输入用户名密码,认证客户端提交数据给认证服务器认证服务器校验用户名密码是否合法,合法响应用户…

RISC-V学习基础(六)

原子指令 RV32A有两种类型的原子操作&#xff1a; 内存原子操作&#xff08;AMO&#xff09;加载保留/条件存储&#xff08;load reserved/store conditional&#xff09; 图6.1是RV32A扩展指令集的示意图&#xff1a; 图6.2列出了它们的操作码和指令格式 AMO&#xff08;at…

chatgpt赋能python:Python如何更新包

Python如何更新包 Python是当今最流行的编程语言之一&#xff0c;它通过其丰富的生态系统和充足的工具库为许多开发者提供了便捷、快速、高效的开发体验。在Python的世界里&#xff0c;包是一种最重要的组件之一&#xff0c;因为它们可以让你轻松地扩展Python的功能&#xff0…

【跨域】如何解决跨域问题

同源策略 同源 相同协议相同域名相同端口 内容 浏览器的同源策略 - Web 安全 | MDN (mozilla.org) 浏览器页面向不同源的服务器发送ajax请求资源时&#xff0c;响应的数据会被浏览器拦截 意义 出于安全性的考虑&#xff0c;防止恶意获取数据 解决方案 JSONP 不使用aj…

Rust每日一练(Leetday0022) 最小路径和、有效数字、加一

目录 64. 最小路径和 Minimum Path Sum &#x1f31f;&#x1f31f; 65. 有效数字 Valid Number &#x1f31f;&#x1f31f;&#x1f31f; 66. 加一 Plus One &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 P…

docker水位如何清理(容器水位清理详细分析)

docker水位过高&#xff0c;清理怕出问题&#xff1f;&#xff0c;不知道清理什么&#xff1f;怕删错了&#xff1f;进入实践 第一步准备测试数据 创建 悬空的镜像&#xff08;即REPOSITORY和TAG均为的镜像&#xff09; docker pull busybox:musl docker tag busybox:musl b…