Flask学习四:补充

插件

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Nginx】Nginx了解(基础)

文章目录 Nginx产生的原因Nginx简介Nginx的作用反向代理负载均衡策略动静分离 Nginx的Windows下的安装Linux下的安装Nginx常用命令 负载均衡功能演示 Nginx产生的原因 背景 一个公司的项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发…

MIT6.5840-2023-Lab2C: Raft-Persistence

前置知识 见上一篇 Lab2A。 实验内容 实现 RAFT&#xff0c;分为四个 part&#xff1a;leader election、log、persistence、log compaction。 实验环境 OS&#xff1a;WSL-Ubuntu-18.04 golang&#xff1a;go1.17.6 linux/amd64 Part 2C: persistence 大部分的bug都与这…

Datawhale 12月组队学习 leetcode基础 day3 递归

这是一个新的专栏&#xff0c;主要是一些算法的基础&#xff0c;对想要刷leedcode的同学会有一定的帮助&#xff0c;如果在算法学习中遇到了问题&#xff0c;也可以直接评论或者私信博主&#xff0c;一定倾囊相助 进入正题&#xff0c;今天咱们要说的是递归&#xff0c;递归是是…

SpringBoot 自动装配原理---源码详解

目录 SpringBoot 自动装配原理源码流程详解&#xff1a;流程总结&#xff1a;条件匹配解释&#xff1a;其他解释&#xff1a; SpringBoot 自动装配原理 源码流程详解&#xff1a; 1、先看启动类&#xff0c;启动这个main方法&#xff0c;然后调用这个run方法。 2、把 启动类作…

牛客网 DP35 【模板】二维前缀和

代码&#xff1a; import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { //…

netty-daxin-3(rpc远程调用)

文章目录 nettyRpcObjectEncoder 与 ObjectDecoderjdk动态代理回顾Rpc调用过程简析服务端客户端 nettyRpc ObjectEncoder 与 ObjectDecoder ObjectEncoder继承自MessageToByteEncoder<Serializable>&#xff0c;它内部使用ByteBufOutputStream包装ByteBuf对象&#xff…

Python 爬虫之简单的爬虫(一)

爬取网页上所有链接 文章目录 爬取网页上所有链接前言一、基本内容二、代码编写1.引入库2.测试网页3.请求网页4.解析网页并保存 三、如何定义请求头&#xff1f;总结 前言 最近也学了点爬虫的东西。今天就先给大家写一个简单的爬虫吧。循序渐进&#xff0c;慢慢来哈哈哈哈哈哈…

TrustGeo代码理解(一)main.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入各种模块和数据库 # -*- coding: utf-8 -*- import torch.nnfrom lib.utils import * import argparse, os import numpy as np import random from lib.model import * import copy from thop import profile imp…

devc++如何建立一个c++项目?devc++提示源文件未编译?

打开devc APP后是这样的界面&#xff1b; 点击文件-> 新建->项目&#xff0c;这一点应该不难&#xff0c;主要是最后这个选择什么&#xff1f; 这样即可。 devc提示源文件未编译&#xff1f; 点击工具->编译选项&#xff1b; 如果不能解决&#xff0c;那就是可能路径…

NNDL 循环神经网络-梯度爆炸实验 [HBU]

目录 6.2.1 梯度打印函数 6.2.2 复现梯度爆炸现象 6.2.3 使用梯度截断解决梯度爆炸问题 【思考题】梯度截断解决梯度爆炸问题的原理是什么&#xff1f; 总结 前言&#xff1a; 造成简单循环网络较难建模长程依赖问题的原因有两个&#xff1a;梯度爆炸和梯度消失。 循环…

代码随想录算法训练营第53天| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

JAVA代码编写 1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情…

软件测试面试八股文(答案解析+视频教程)

1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢。 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xf…

【华为数据之道学习笔记】3-10元数据管理架构及策略

元数据管理架构包括产生元数据、采集元数据、注册元数据和运 维元数据。 产生元数据&#xff1a; 制定元数据管理相关流程与规范的落地方案&#xff0c;在IT产品开发过程中实现业务元数据与技术元数据的连接。 采集元数据&#xff1a; 通过统一的元模型从各类IT系统中自动采集元…

Linux下FFmepg使用

1.命令行录一段wav,PCM数据 ffmpeg -f alsa -i hw:0,0 xxx.wav//录制 ffplay out.wav//播放ffmpeg -f alsa -i hw:0,0 -ar 16000 -channels 1 -f s16le 1.pcm ffplay -ar 16000 -channels 1 -f s16le 1.pcm -ar freq 设置音频采样率 -ac channels 设置通道 缺省为1 2.将pcm…

002.Java实现两数相加

题意 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示两数之和的新链表。 示例 输入&#xff1a;l1[2,4,3],l2[5,6,4] 输出…

【从零开始学习JVM | 第七篇】深入了解 堆回收

前言&#xff1a; Java堆作为内存管理中最核心的一部分&#xff0c;承担着对象实例的存储和管理任务。堆内存的高效使用对于保障程序的性能和稳定性至关重要。因此&#xff0c;深入理解Java堆回收的原理、机制和优化策略&#xff0c;对于Java开发人员具有重要的意义。 本文旨在…

springcloud-分布式缓存

文章目录 一.Redis持久化1.RDB持久化2.AOF持久化 二.Redis主从1.搭建主从架构2.全量同步3.增量同步 三.Redis哨兵1.哨兵的作用和原理2.搭建哨兵架构3.RedisTemplate的哨兵模式 四.Redis分片集群1.搭建分片集群2.散列插槽3.集群伸缩4.故障转移5.RedisTemplate访问分片集群 为什么…

树莓派(Raspberry Pi)4B密码忘记了,怎么办?

树莓派长时间不用&#xff0c;导致密码忘记了&#xff0c;这可咋整&#xff1f; 第1步&#xff1a;取出SD卡 将树莓派关机&#xff0c;移除sd卡&#xff0c;使用读卡器&#xff0c;插入到你的电脑。 第2步&#xff1a;编辑 cmdline.txt 在PC上打开SD卡根目录&#xff0c;启动…

Kotlin ArrayList类型toTypedArray转换Array

Kotlin ArrayList类型toTypedArray转换Array data class Point(val x: Float, val y: Float)fun array_test(points: ArrayList<Array<Point>>) {points.forEachIndexed { idx, ap ->ap.forEach {print("$idx $it ")}println()} }fun main(args: Arra…

2697. 字典序最小回文串

2697. 字典序最小回文串 难度: 简单 来源: 每日一题 2023.12.13 给你一个由 小写英文字母 组成的字符串 s &#xff0c;你可以对其执行一些操作。在一步操作中&#xff0c;你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 &#xff0c;使 s 变…