Flask学习二:项目拆分、请求与响应、cookie

news2024/11/29 10:32:23

教程

教程地址: 千锋教育Flask2框架从入门到精通,Python全栈开发必备教程

老师讲的很好,可以看一下。

项目拆分

项目结构
在这里插入图片描述
在项目根目录下,创建一个App目录,这是项目下的一个应用,应该类似于后端的微服务,一个微服务算作一个应用。

App目录下创建static目录,存放静态文件,也就是对应的cssjs
App目录下创建templates目录,存放模板,也就是对应的html

如果只是拿来写后台不需要前端部分,上面这两个目录都可以不用创建。

App目录下创建__init__.py,这是这个应用的初始化文件
App目录下创建models.py,这是这个应用的模型与数据库文件
App目录下创建views.py,这是这个应用的路由和视图函数

在项目根目录下创建app.py,这是整个项目的启动文件。

__init__.py

# 初始化文件,创建Flask应用
from flask import Flask
from .views import blue

def create_app():
    app = Flask(__name__)
    # 注册蓝图
    app.register_blueprint(blueprint=blue)
    return app

models.py

# 存放模型、数据库
# 暂时为空的,后面使用

views.py

# 存放路由+视图函数
# 使用蓝图的方式来管理
from flask import Blueprint
# 引入模型
from .models import *

# 创建蓝图,名字可以随意定义
blue = Blueprint('user', __name__)


@blue.route('/')
def index():
    return "index"

app.py

from App import create_app

app = create_app()
if __name__ == '__main__':
    app.run(debug=True)

运行app.py启动项目,项目启动成功,说明拆分没有问题。

在这里插入图片描述

上面的拆分使用到了蓝图

在Flask框架中,蓝图(Blueprint)是一种组织和管理路由的方式。它允许将应用程序分成一组相关的视图、模板和静态文件。通过蓝图,您可以将应用程序的功能模块化,使得代码更加清晰和可维护。
使用蓝图,您可以在应用程序中定义多个蓝图对象,每个蓝图对象都表示一个独立的模块。每个蓝图可以有自己的路由、视图函数、模板和静态文件。
通过将蓝图注册到应用程序中,可以将蓝图的功能集成到整个应用程序中。这样,您可以更好地组织和管理代码,使得不同模块之间的代码更加独立和可重用。
使用蓝图的一个常见场景是构建大型应用程序,其中有多个功能模块需要独立开发和维护。蓝图的优点是可以使得团队成员在不同模块上并行开发,同时保持代码的整洁和可扩展性。

请求与相应

请求

服务器在接收到客户端的请求后,会自动创建Request对象,该对象由Flask框架创建,不允许修改。

常用属性

url		完整的请求地址
base_url	去掉get参数的url
host_usr	只有主机和端口号的url
path	路由中的路径
method	请求方式
remote_addr	请求的客户端地址
args	get请求参数
form	post请求参数
files	文件上传
headers	请求头
cookies	请求中的cookie
user_agent 用户代码,包括浏览器和操作系统,可以用于反爬虫

常用方法

# 获取get请求的参数,get请求会出现属性名相同的情况
request.args.get(属性名) 或 request.args.getlist(属性名)

# 获取post请求参数
request.form.get(属性名)

# 获取cookie
request.cookies.get(属性名)

响应

服务器想客户端返回的消息

响应的几种类型:字符串、模板渲染(常用于前后端不分离)、返回json数据(常用于前后端分离)、自定义Response对象

cookie

cookie本身由浏览器保存,通过Responsecookie写到浏览器,下一次访问时,浏览器会根据不同的规则携带cookie过来。常用于登录

特点

  • 客户端会话技术,浏览器的会话技术
  • 数据存储在客户端中
  • 存储时使用键值对的结构进行存储
  • 特性
    • 支持过期时间
    • 默认会自动携带本网站的所有cookie
    • 根据域名进行cookie存储
    • 不能跨浏览器
  • cookie是通过服务器创建的response对象来创建的

设置cookie

response.set_cookie(key,value[,max_age=None,exprise=None])
   max_age:整数,指定过期时间
   exprise:整数,指定过期时间,可以指定一个具体的日期时间
   两者只能选择一个

获取cookie

request.cookie.get(key)

删除cookie

response.delete_cookie(key)

基本流程
在这里插入图片描述
示例

登录界面 login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录</title>
</head>
<body>
    <h2>登录</h2>
    <hr />
    <!-- 使用视图函数访问,会自动解析成相应的路径 蓝图user下的login函数-->
    <form action="{{url_for('user.login')}}" method="post">
        <p>
            用户名:<input type="text" name="username" />
        </p>
        <p>
            密码:<input type="text" name="password" />
        </p>
        <p>
            <button>提交</button>
        </p>
    </form>
</body>
</html>

首页home.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>首页</title>
</head>

<body>
    <h2>首页</h2>
    <hr />
    {% if username %}
    <p>欢迎用户:{{username}}</p>
    {% endif %}
    <!-- 路由跳转,使用定义好的路由地址 -->
    <a href="/login/">登录</a>
</body>

</html>

路由和试图函数

# 双路由,访问/还是/home/,都会跳转到同一个页面
@blue.route("/")
@blue.route("/home/")
def index():
    # 4、获取cookie,访问请求时会自动带上相应的cookie
    username = request.cookies.get("username")
    return render_template("home.html", username=username)

# 允许get、post两种请求方式
@blue.route("/login/", methods=["GET", "POST"])
def login():
    # GET 访问登录页面
    if request.method == "GET":
        return render_template("login.html")
    # POST 登录
    elif request.method == "POST":
        # 1、获取前端提交的表单数据
        username = request.form.get("username")
        password = request.form.get("password")
        # 2、模拟登录
        if username == "李四" and password == "123":
            # 登录成功,跳转至首页
            response = redirect(url_for("user.index"))
            # 3、设置cookie
            # response.set_cookie("username", username) # 默认浏览器关闭则cookie失效
            response.set_cookie("username", username, max_age=3600 * 24 * 1)  # 1天后过期
            return response
        else:
            return "用户名或密码错误"

# 注销
@blue.route("/layout/")
def layout():
    response = redirect(url_for("user.index"))
    # 5删除cookie
    response.delete_cookie("username")
    return response

在这里插入图片描述

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

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

相关文章

从 CoT 到 Agent,最全综述来了!上交出品

就在前两天&#xff0c;我们刚刚和大家聊了聊最近相当火爆的 AI Agents 这一概念&#xff1a;聊聊我对AI Agents技术的一些看法。水平所限&#xff0c;我们也只是浅浅为大家梳理了一下 AI Agents 的概念发展与其代表性技术&#xff0c;一来不深入二来不细致&#xff0c;只能供大…

机器学习库:pandas

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 写在开头 基本数据格式 DataFrame 数据选取 iloc 数据描述 head describe 数据合并 merge 数据删除 drop drop删除多列 处理缺失…

京东秒杀之商品列表

1 在gitee上添加.yml文件 1.1 添加good-server.yml文件 server:port: 8084 spring:datasource:url: jdbc:mysql://localhost:3306/shop_goods?serverTimezoneGMT%2B8driverClassName: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceusername: rootpa…

MATLAB和S7-1200PLC水箱液位高度PID控制联合仿真(MODBUSTCP通信)

MATLAB和SMART 200PLC的联合仿真请查看下面文章链接 MATLAB Simulink和SMART PLC水箱液位高度PID控制(联合仿真)-CSDN博客文章浏览阅读606次。SMART PLC 向导PID的详细介绍请查看下面文章链接:S7-200 SMART PLC PID向导详细介绍(如何实现P、PD、PID控制器)-CSDN博客文章浏览阅…

231126 刷题日报

1. 高楼扔鸡蛋 O(N*logN) 2. 698. 划分为k个相等的子集 没做出来&#xff0c;和划分两个子集不同 3. 300. 最长递增子序列 LIS petencie sorting 没看懂&#xff0c;明天看吧 4. 518. 零钱兑换 II 完全背包问题&#xff1a;每个物品数量是无限的 注意&#xff1a;dp的定义…

shiro整合redis

shiro整合redis 前言&#xff1a;shiro默认的session是存储在jvm内存中的&#xff0c;这样会导致java服务内存占用更大以及一旦服务器宕机或者版本迭代需要重启服务时&#xff0c;缓存中的数据不能恢复&#xff0c;导致用户需要重新登录认证&#xff0c;体验很差。因此利用第三…

相识词设计思路及实现方法

目录 1.业务背景 2.实现方法 第一种&#xff1a; ​编辑 第二种&#xff1a; 3.相关材料 1.业务背景 业务有全文检索功能&#xff0c;然后根据标书的要求需要有近似词的功能&#xff0c;一般近似词需要模型训练之后成为词库&#xff0c;是需要大数据相关人员负责。负责人表示…

代码随想录算法训练营 ---第四十二天

今天开始学习 动态规划&#xff1a;背包问题 也是比较难的一部分了 动态规划&#xff1a;背包问题 理论基础 01背包&#xff08;二维数组&#xff09; 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用…

MySQL进阶_10.锁

文章目录 一、概述二、MySQL并发事务访问相同记录2.1、读-读2.2、写-写2.3、读-写2.4、并发问题的解决方案 三、锁的不同角度分类3.1、 读锁、写锁3.1.1、 锁定读 3.2、表级锁、页级锁、行锁3.2.1、表锁3.2.2、意向锁3.2.2.1、意向锁的作用3.2.2.2、意向锁的互斥性 3.2.3、自增…

简单订单和支付业务的相关流程

1、订单创建、支付及订单处理流程图 2、创建HTTP客户端工具类 Slf4j public class HttpclientUtil {//类中定义了一个私有静态成员变量instance&#xff0c;并且将其初始化为HttpclientUtil类的一个实例&#xff0c;用于实现单例模式。private static HttpclientUtil instance…

LV.12 D20 RTC实验 学习笔记

一、RTC简介 RTC(Real Time Clock)即实时时钟&#xff0c;它是一个可以为系统提供精确的时间基准的元器件&#xff0c;RTC一般采用精度较高的晶振作为时钟源&#xff0c;有些RTC为了在主电源掉电时还可以工作&#xff0c;需要外加电池供电 二、Exynos4412下的 RTC控制器 它支持…

手摸手Element-Plus组件化开发

前端环境准备 编码工具: VSCode 依赖管理:NPM 项目构建: Vuecli NPM的全称是Node Package Manager&#xff0c;是一个NodeJS包管理和分发工具&#xff0c;已经成为了非官方的发布Node模块&#xff08;包&#xff09;的标准。2020年3月17日&#xff0c;Github宣布收购npm&am…

【研究中2】sql server权限用户设置

--更新时间2023.11.26 21&#xff1a;30 负责人&#xff1a;jerrysuse DBAliCMSIF EXISTS (select * from sysobjects where namehkcms_admin)--判断是否存在此表DROP TABLE hkcms_adminCREATE TABLE hkcms_admin (id int identity(1, 1),--id int primary key identity…

《已解决:TypeError: unhashable type: ‘slice‘ 问题》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

基于springboot学籍管理系统

一、设计目的 1. 复习、巩固Java语言的基础知识&#xff0c;进一步加深对Java语言的理解和掌握&#xff1b; 2. 课程设计为学生提供了一个既动手又动脑&#xff0c;独立实践的机会&#xff0c;将课本上的理论知识和实际有机的结合起来&#xff0c;锻炼学生的分析解决实际问题…

第二十三章 解析PR曲线、ROC曲线、AUC、AP(工具)

混淆矩阵Confusion Matrix 混淆矩阵定义 混淆矩阵是机器学习中总结分类模型预测结果的情形分析表&#xff0c;以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值&#xff0c;矩阵的列表示预测值&#xff0c;下面我…

cephadm部署ceph quincy版本,使用ceph-csi连接

环境说明 IP主机名角色 存储设备 192.168.2.100 master100 mon,mgr,osd,mds,rgw 大于5G的空设备192.168.2.101node101mon,mgr,osd,mds,rgw大于5G的空设备192.168.2.102node102mon,mgr,osd,mds,rgw大于5G的空设备 关闭防火墙 关闭并且禁用selinux 配置主机名/etc/hosts …

【Amazon】在Amazon EKS集群中安装部署最小化KubeSphere容器平台

文章目录 一、准备工作二、部署 KubeSphere三、访问 KubeSphere 控制台四、安装Amazon EBS CSI 驱动程序4.1 集群IAM角色建立并赋予权限4.2 安装 Helm Kubernetes 包管理器4.3 安装Amazon EBS CSI 驱动程序 五、常见问题六、参考链接 一、准备工作 Kubernetes 版本必须为&…

RocketMQ的push消费方式实现的太聪明了

最近仍然畅游在RocketMQ的源码中&#xff0c;这几天刚好翻到了消费者的源码&#xff0c;发现RocketMQ的对于push消费方式的实现简直太聪明了&#xff0c;所以趁着我脑子里还有点印象的时候&#xff0c;赶紧来写一篇文章&#xff0c;来掰扯一下&#xff0c;防止过两天就忘得一干…

[网络] 5. TCP 链接的建立与释放~汇总

大部分内容源于网络加之个人理解&#xff5e;巨人的肩膀有多大决定你可以看得多远&#xff5e; 文章目录 1. 三次握手说一下三次握手的过程为什么是三次握手 2. 四次挥手说一下四次挥手的过程为什么需要四次挥手有可能出现三次挥手吗&#xff0c;什么时候会出现呢&#xff1f;为…