Flask学习四:补充

news2024/9/22 17:22:29

插件

flask-caching

简介
Flask-Caching 是一个 Flask 扩展,旨在为 Flask 应用程序添加缓存功能。缓存是一种提高应用性能的技术,通过将常用数据暂时存储在一个快速访问的位置(如内存或磁盘),从而减少对较慢资源(如数据库或网络服务)的重复访问。

Flask-Caching 提供了一种简单的方式来缓存视图函数的结果或者任何可调用对象的结果,并且支持多种缓存后端,包括内存缓存(如 SimpleCache)、文件系统缓存、Memcached 缓存以及 Redis 缓存等。这意味着开发者可以根据应用程序的需求和基础设施选择最适合的缓存方式。

通过 Flask-Caching,开发人员可以轻松实现诸如页面缓存、模板片段缓存、函数结果缓存等功能。此外,它还提供了灵活的配置选项,以便根据业务需求调整缓存行为,如设置过期时间、使用不同的缓存策略等。

使用
安装

pip install flask-caching

初始化

from flask_caching import Cache  # 缓存

cache= Cache(config={
    'CACHE_TYPE': 'simple',
    'CACHE_DEFAULT_TIMEOUT': 3600 ,# 设置过期时间为1小时,过期后会被自动删除
})  # 缓存

cache.init_app(app=app) # 绑定缓存

使用
在视图函数上添加缓存

@cache.cached(timeout=60) # 1分钟后过期
@userManageBlue.route('/user-manage/')
def index():

使用场景

频繁访问的数据库查询结果:如果某个视图函数执行了复杂的数据库查询操作,并且这个查询结果在短时间内不会发生变化,那么可以使用Flask-Caching来缓存查询结果,避免每次请求都执行这个查询操作,提高响应速度。

渲染的页面内容:如果某个页面的内容不经常变化,并且需要花费较长时间来生成,那么可以使用Flask-Caching来缓存页面内容。这样,当多个用户请求同一个页面时,可以直接返回缓存的页面内容,减少服务器的负载和响应时间。

钩子函数(中间件)

钩子函数的使用
钩子函数是指在执行函数或者目标函数之间挂载的函数,框架开发者给调用方法提供一个point-挂载点,是一种AOP切面编程思想

常见的钩子函数有:

  • before_first_request:处理第一次请求时执行
  • before_request:在每次请求之前执行,通常使用这个钩子函数预处理一些变量,实现反爬虫
  • after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行
  • teardown_appcontext:当app上下文被移除后执行的函数,可以进行数据库的提交或者回滚

示例:反爬虫策略

# 相同ip地址1秒内不允许重复访问
key = request.remote_addr + "before"
valeu = cache.get(key)
if value :
	return "别爬了,你被发现了~^~"
else :
	cache.set(key,'aa',timeout=1)

# 防止非浏览器访问
ua = request.user_agent
if not ua:
	return "hello"
@baseBlue.before_request
def before():
    print("我是钩子函数")

与装饰器的区别

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if session.get("id") is None:
            return jsonify({"code": 401, "data": '', "msg": "登录失效"})
        return f(*args, **kwargs)
    return decorated_function

上面的是一个简单的装饰器,用于判断是否登录失效。这段代码也可以通过钩子函数来实现,装饰器和钩子函数的区别是:

  • 装饰器方式:你需要在每一个路由函数前都加上@login_required装饰器,以确保在进入路由函数之前进行登录检查。这种方式灵活,可以选择性地对一部分路由函数进行登录检查,但是需要在每个路由函数上都添加装饰器。

  • 钩子函数方式:你只需要在应用程序的全局范围内定义一个before_request钩子函数,它会在每个请求处理之前被调用。这种方式更为简洁,只需要在一个地方定义登录检查逻辑,而不需要在每个路由函数上都添加装饰器。

使用钩子函数的优点是可以避免在每个路由函数上都添加装饰器的重复工作,提高了代码的可维护性。但是需要注意,在使用钩子函数时,登录检查逻辑将应用于所有的请求,可能需要进行一些额外的逻辑处理来排除不需要登录检查的请求。

内置对象

可以直接从flask中导入使用

  • request:请求对象
  • session:回话对象
  • gglobal全局对象
  • current_app:flask应用对象

静态文件目录

允许用户可以直接通过对应的链接来访问网站的静态文件,最常见的就是图片。在浏览器里输入图片路径可以直接访问服务器里图片文件。

默认情况下就是static目录和/static,如下图:
在这里插入图片描述
如果想要修改的话,可以使用下面的代码

from flask import Flask

app = Flask(__name__)

# 设置静态文件夹的路径和URL路径
app.static_folder = 'static'
app.static_url_path = '/static'

if __name__ == '__main__':
    app.run()

注意:static_folder static_url_path需要同时设置。但是一般情况下是不需要改变的,因为你网站本身需要的静态文件也会受到影响。

正确情况下可以通过钩子函数来判断有没有访问静态文件的权限

@app.before_request
def check_permission():
    # 获取请求的URL
    url = request.path

    # 判断是否需要权限验证
    if '/static/' in url:
        # 获取用户的权限
        user_permission = session.get('permission')

        # 判断用户是否有权限访问静态文件
        if user_permission != app.config['USER_PERMISSION']:
            # 没有权限,返回 403 Forbidden
            return '403 Forbidden', 403

另外就算是有访问权限也需要避免短时间里重复请求,从而提高网站的性能

# 设置一个钩子函数,避免被人重复请求静态文件
@app.route('/static/<path:filename>')
def static_files(filename):
    return send_from_directory(app.static_folder, filename)


@app.after_request
def add_cache_control(response):
    response.headers['Cache-Control'] = 'max-age=3600'  # 设置缓存时间为1小时
    return response

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

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

相关文章

ssm基于MVC的舞蹈网站的设计与实现论文

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;舞蹈网站当然也不能排除在外。舞蹈网站是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;采用Java技…

自动化测试(终章)webdriver的常用api(2)以及新的开始

目录 多层框架/窗口定位 多层框架的定位 frame是什么&#xff1f; 多层窗口定位 层级定位 使用 XPath 进行层级定位&#xff1a; 使用 CSS 选择器进行层级定位&#xff1a; 下拉框处理 alert、confirm、prompt 的处理 Alert 弹窗&#xff1a; Confirm 弹窗&#xff…

万兆网络之屏蔽线序接法(上)

可以经常听到用RJ45指代网线&#xff0c;用RJ11指代电话线的&#xff0c;RJ&#xff08;Registered Jack&#xff09;即已注册插口&#xff0c;可以简单理解为一种约定就行&#xff08;参见参考链接&#xff09; 前一篇已经讲到&#xff0c;网线线对互相缠绕是为了电流方向相反…

Redis List类型

列表类型是用来存储多个有序的字符串&#xff0c;如图所示&#xff0c;a、b、c、d、e 五个元素从左到右组成了一个有序的列表&#xff0c;列表中的每个字符串称为元素 (element)&#xff0c;一个列表最多可以存储2的32次方 -1个元素。在 Redis 中&#xff0c;可以对列表两端插入…

spring面试:一、面试题分类总览+bean线程安全问题+AOP相关问题(定义、使用步骤、编程式事务管理和声明式事务管理和声明式事务管理失效)

面试题分类总览 bean线程安全问题 单例/多例 单例&#xff08;singleton&#xff09;&#xff1a;在每个spring ioc容器中都只有一个实例。 多例&#xff08;prototype&#xff09;&#xff1a;在每个spring ioc容器中有多个实例。 默认情况下spring中的bean都是单例的。但是…

【星环云课堂大数据实验】kafka消息发布与订阅

文章目录 一、Kafka概述二、实验环境三、实验准备四、实验目的五、实验步骤5.1、创建Kafka Topic5.2、Kafka消息发布5.3、Kafka消息订阅 六、实验感悟 一、Kafka概述 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。该项目的目标是为处理实…

算法Day33 不会算数的小明

不会算数的小明 Description 现在有一个数字startValue&#xff0c;小明不会算数&#xff0c;只会以下两种操作&#xff1a; 双倍&#xff08;Double&#xff09;&#xff1a;将数字乘2&#xff1b; 递减&#xff08;Decrement&#xff09;&#xff1a;将数字减1。 给定两个整…

Python3开发笔记(简洁版)

一、开发编辑器 1. pycharm 2. IDLE&#xff08;Python自带软件&#xff09; 方法&#xff1a;Microsoft Store搜索 Python 安装 二、数据类型 Python中有以下几种主要的数据类型&#xff1a; 数字&#xff08;Numbers&#xff09;、 字符串&#xff08;Strings&#xff09…

linux(centos7)mysql8.0主从集群搭建(两台机器)

docker安装:&#xff08;转载&#xff09;centos7安装Docker详细步骤&#xff08;无坑版教程&#xff09;-CSDN博客 环境信息 主数据库服务器&#xff1a;192.168.1.10 从数据库服务器&#xff1a;192.168.1.11 1. mysql8.0镜像下载 docker pull mysql:8.0.23 2.创建docke…

CMS—评论功能设计

一、需求分析 1.1、常见行为 1.敏感词过滤 2.新增评论&#xff08;作品下、评论下&#xff09; 3.删除评论&#xff08;作品作者、上级评论者、本级作者&#xff09; 4.上级评论删除关联下级评论 5.逻辑状态变更&#xff08;上线、下线、废弃...&#xff09; 6.上逻辑状态变更…

图片的批量建码怎么做?一图一码的制作方法

在使用图片展示内容时&#xff0c;经常会有同一类型的图片信息是有区别的&#xff0c;如果需要将每张图片批量生成二维码图片&#xff0c;那么出了一张一张去制作之外&#xff0c;有没有能够一键批量建码的功能可以解决这个问题呢&#xff1f;下面来给大家分享一下图片批量建码…

社交网络分析2(下):社交网络情感分析的方法、挑战与前沿技术

社交网络分析2&#xff08;下&#xff09;&#xff1a;社交网络情感分析的方法、挑战与前沿技术 写在最前面7. 词嵌入&#xff08;word embedding&#xff09;的主要目的是什么&#xff1f;结合某方法简要地说明如何实现词嵌入。主要目的实现方法示例&#xff1a;GloVe案例分析…

透明PP专用UV胶水粘接PP材料高效率的提升生产效率

使用透明PP专用UV胶水粘接PP材料是提高生产效率的方法。以下方法&#xff0c;可以助您在生产中实现高效的PP材料粘接&#xff1a; ​1.选用合适的透明PP专用UV胶水 选择经过专门设计用于透明PP的UV胶水。这种胶水具有透明性&#xff0c;能保证粘接后的清晰度和外观。 2.自动…

Qt中槽函数在那个线程执行的探索和思考

信号和槽是Qt的核心机制之一&#xff0c;通过该机制大大简化了开发者的开发难度。信号和槽属于观察者模式&#xff08;本质上是回调函数的应用&#xff09;。是函数就需要考虑其是在那个线程中执行&#xff0c;本文讨论的就是槽函数在那个线程中执行的问题。 目录 1. connect…

关于负载和驱动能力的问题总结

这两天重新接触到了驱动能力这个说法&#xff0c;之前也听过&#xff0c;但是一直不理解是怎么回事儿&#xff0c;也就没有深究&#xff0c;现在想来&#xff0c;这里面还是有点门道的。 驱动能力&#xff0c;说的是什么呢&#xff1f;应该就是带载能力&#xff0c;而带载能力&…

热烈庆祝安徽普朗膜技术有限公司参加2024济南生物发酵展

公司自2004年注册成立以来主要业务领域主要有以乳酸、氨基酸、抗生素为主的发酵液的提取分离&#xff1b;醋、酱油发酵产品的产品升级&#xff0c;果汁、茶饮料等天然产物提取的除菌和澄清过滤&#xff1b;低聚木糖、低聚果糖、果葡糖浆、高果糖浆等过滤、纯化、浓缩&#xff1…

RRC下的NAS层

无线资源控制&#xff08;Radio Resource Control&#xff0c;RRC&#xff09;&#xff0c;又称为无线资源管理&#xff08;RRM&#xff09;或者无线资源分配&#xff08;RRA&#xff09;&#xff0c;是指通过一定的策略和手段进行无线资源管理、控制和调度&#xff0c;在满足服…

D34|不同路径

62.不同路径 初始思路&#xff1a; 1&#xff09;确定dp数组以及下标的含义&#xff1a; dp[i][i]存放到第i1行和第i1列的方法数 2&#xff09;确定递推公式&#xff1a; dp[i][i] dp[i -1][i] dp[i][i-1] 3&#xff09;dp数组如何初始化 第0行是1&#xff1b; 第0列是1&a…

关于文件操作---C语言

引言 关于文件&#xff0c;想必大家或多或少都会有些了解&#xff0c;文件可以帮我们储存数据&#xff0c;不同格式的文件可以储存不同类型的数据&#xff0c;也可以将文件中的数据用不同的方式打开。电脑中的文件&#xff0c;是放在硬盘上的。在我们编写代码并运行的时候&…

KAKFA实践零碎记录

这里写目录标题 1 内存泄露2 生产者报错 1 内存泄露 错误信息 反复执行&#xff1a;创建消费者->关闭消费者后&#xff0c;内存缓慢上升且GC不能回收内存 错误原因 关闭消费者需要执行KafkaConsumer#close()函数 public void close() {this.close(Duration.ofMillis(30000…