【Django】缓存、中间件、分页、生成csv文件

news2024/9/21 11:15:33

一、缓存

定义:可以更快的读取数据的介质。一般用来存储临时数据,常用介质的是读取数据很快的内存。

缓存场景:
1、博客列表页
2、电商商品详情页
场景特点:缓存的地方,数据变动频率较少

1、数据库缓存

当把一次负责查询的结果直接存储到表里,比如多个条件的过滤查询结果,可避免重复进行复杂查询,提升效率。

CACHES = {
'default':{
	'BACKEND':'django.core.cache.backends.db.DatabaseCache',
	'LOCATION':'my_cache_table',
	'TIMEOUT':300, #缓存保存时间,单位秒,默认值300
	'OPTIONS':{
		'MAX_ENTRIES':300,#缓存最大数据条数
		'CULL_FREQUENCY':2,#缓存条数达到最大值时,删除1/x的缓存数据
		}
	}
}

终端执行python manage.py createcachetable

(1)整体缓存

方式1:视图函数

from django.views.decorators.cache import cache_page
@cache_page(30) # 单位s
def my_view(request):
	pass

方式2:路由中

from django.views.decorators.cache import cache_page
urlpatterns = [
	path('foo/',cache_page(60)(my_view))
]

(2)局部缓存

引入cache对象
方式1:使用caches[‘CACHE’配置key’](适合有多个缓存配置项的情况)

from django.core.cache import caches
cache1 = caches['myalias']

方式2:from django.core.cache import cache 相当于直接引入CACHES配置项中的’default’项

缓存api的使用:
1、存储缓存:cache.set(key,value,timeout)

  • key:缓存的key,字符串类型
  • value:python对象
  • timeout:缓存时间s,默认为配置项中的TIMEOUT值
  • 返回值:None

2、获取缓存:cache.get(key)

  • key:缓存的key
  • 返回值:为key的具体值,若没有值则返回None

3、存储缓存:cache.add(key,value) 只在key不存在时生效

  • 返回值:True or False

4、存储缓存:cache.get_or_set(key,value,value) 若未获取到,则执行set

  • 返回值:value

5、批量存储缓存:cache.set_many(dict,value)

  • 返回值:插入不成功的key的数组

6、批量获取缓存:cache.get_many(key_list)

  • 返回值:取到的key和value的字典

7、删除缓存:cache.delete(key)

  • 返回值:None

8、批量删除缓存:cache.delete_many(key_list)

  • 返回值:None

2、本地内存缓存

主要用于测试,使用频率不高

CACHES = {
'default':{
	'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
	'LOCATION':'unique-snowflake',
}

3、文件系统缓存

缓存数据存储到本地文件中,不推荐用

CACHES = {
'default':{
	'BACKEND':'django.core.cache.filebased.locmem.FileBasedCache',
	'LOCATION':'文件夹路径',
}

4、浏览器缓存

在这里插入图片描述

在这里插入图片描述

cache装饰器可以自动给浏览器添加响应头。

在这里插入图片描述
在这里插入图片描述

此方法只根据时间判断,不够严谨,故常用后者

在这里插入图片描述

二、中间件

以类的形式体现,是Django请求/响应处理的钩子框架,是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入输出。每一个中间件负责做一些特定的功能。
在这里插入图片描述

1、中间件编写

  1. 继承自django.utils.deprecation.MiddlewareMixin
  2. 必须实现下列五个方法中的一个或多个:
  3. process_request(self,request) 执行路由前被调用,在每个请求上调用,返回None或HttpResponse对象
  4. process_view(self,request,callback,callback_args,callback_kwargs) 调用视图函数前被调用,在每个请求上调用,返回None或HttpResponse对象
  5. process_response(self,request,response) 响应返回浏览器前被调用,在每个请求上调用,返回HttpResponse对象
  6. process_exception(self,request,exception) 当处理过程中抛出异常时调用,返回一个HttpResponse对象
  7. process_template_response(self,request,response) 在视图函数执行完毕且试图返回的对象中包含render的方法时被调用,需要返回实现了render方法的响应对象。

2、注册中间件

1、settings.py中注册自定义的中间件MIDDLEWARE= ['middleware.mymiddleware.MyMW',]
2、在项目目录下创建middleware文件夹
3、编写mymiddleware.py

from django.utils.deprecation import MiddlewareMixin
class MyMW(MiddlewareMixin):
    def process_request(self,request):
        print('MyMW precess_request doing -- ')
    def process_view(self,request,callback,callback_args,callback_kwargs):
        print('MyMW process_view doing -- ')
    def process_response(self,request,response):
        print('MyMW process_response doing -- ')
        return response

进入视图函数前,按照中间件注册顺序执行;在视图函数之后,中间件按照逆序调用的。

3、练习

用中间件实现强制某个IP地址只能向/test开头的地址发送5次请求。
request.META['REMOTE_ADDR']可以得到远程客户端的IP地址。
request.path_info可以得到客户端访问的请求路由信息。

class VisitLimit(MiddlewareMixin):
    visit_times={}
    def process_request(self,request):
        ip_address = request.META['REMOTE_ADDR']
        path_url = request.path_info
        if not re.match('^/test',path_url):
            return None
        times = self.visit_times.get(ip_address,0)
        print('ip',ip_address,'已经访问',times)
        self.visit_times[ip_address] = times + 1
        return None if times < 5 else HttpResponse('您已经访问过'+str(times)+ '次,访问被禁止')

4、Django接收请求、直到响应出的全过程-面试题

在这里插入图片描述

1、经历request中间件
2、urls / response中间件
3、经历view中间件
4、MTV层 / response中间件
5、有异常则经历exception异常捕获中间件 / response中间件
6、response中间件

5、CSRF - 跨站伪造请求攻击

(1)概念

某些恶意网站上包含链接、表单内容或JavaScript,他们会利用登陆过的用户在浏览器中的认证信息视图在你的网站上完成某些操作。

(2)Django处理csrf

Django采用‘对比暗号’机制,Cookies中存储暗号1,模板中的表单里藏着暗号2,用户只有在本网站下提交数据,暗号2才会随表单提交给服务器,diango对比两个暗号,对比成功,则认为是合法请求,否则是违法请求403响应码。
在这里插入图片描述

配置:

  1. settings中确定MIDDLEWAREdjango.middleware.csrf.CsrfViewMiddleware是否打开
  2. 模板中form标签下添加{%csrf_token%}标签

特殊说明:如果某个视图不需要csrf保护,可以用装饰器from django.views.decorators.csrf import csrf_exempt

三、分页

web页面有大量数据需要显示,为了方便阅读在每个页中只显示部分数据。

1、Paginator对象

Django使用django.core.paginator模块的Paginator类来管理分页数据。

  • 构造方法:paginator = Paginator(object_list,per_page)
  • object_list :需要分页数据的对象列表
  • per_page:每页数据个数
  • 返回值:Paginator的对象

2、Paginator属性

  • count:需要分页数据的对象总数
  • num_pages:分页后的页面总数
  • page_range:从1开始的range对象,用于记录当前码数
  • per_page:每页数据的个数

3、Paginator方法

  • 方法:paginator对象.page(number)
  • 参数number:页码信息 从1开始
  • 返回值:当前number页对应的页信息
  • 如果提供的页码不存在,抛出InvalidPage异常
  • InvalidPage是总的异常基类,包含PageNotAnInteger(不是整数)和EmptyPage(该页面无对象)

4、page对象

page对象属性与方法:

  • object_list:当前页上所有数据对象的列表
  • number:当前页的序号,从1开始
  • paginator:当前page对象绑定的Paginator对象
  • has_next():如果有下一页返回True
  • has_previous():如果有上一页返回True
  • has_other_pages():如果有上一页或下一页返回True
  • next_page_number():返回下一页的页码,不存在则抛出InvalidPage异常。
  • previous_page_number():返回上一页的页码,不存在则抛出InvalidPage异常。

5、示例

分3页显示数组[‘a’,‘b’,‘c’,‘d’,‘e’]

def test_page(request):
    # /test_page?page=4
    page_num = request.GET.get('page',1)
    all_data = ['a','b','c','d','e']
    paginator = Paginator(all_data,2)
    # 初始化具体页码的page对象
    c_page = paginator.page(int(page_num))
    return render(request,'test_page.html',locals())
<body>
    {% for p in c_page %}
    <p>
        {{p}}
    </p>
    {% endfor %}

    <!-- 上一页 -->
    {% if c_page.has_previous %}
        <a href="/test_page?page={{ c_page.previous_page_number }}">上一页</a>
    {% else %}
        上一页
    {% endif %}


    <!-- 是当前页显示成不可点 不是当前页显示成链接 -->
    {% for p_num in paginator.page_range %}
        {% if p_num == c_page.number %}
            {{ p_num }}
        {% else %}
            <a href="/test_page?page={{p_num}}">{{p_num}}</a>

        {% endif %}
    {% endfor %}

    <!-- 下一页 -->
    {% if c_page.has_next %}
        <a href="/test_page?page={{ c_page.next_page_number }}">下一页</a>
    {% else %}
        下一页
    {% endif %}
</body>

四、生成csv文件

触发浏览器下载csv文件

import csv
with open('test_csv.csv','w',newline='') as csvfile:
	writer = csv.writer(csvfile)
	writer.writerow(['a','b','c'])
	writer.writerow(['d','e'])
  • 响应Content-Type类型修改为text/csv。
  • 响应会获得一个额外的Content-Disposition标头,其中包含CSV文件的名称。它将被浏览器用于开启“另存为”对话框。
import csv
from django.http import HttpResponse
from .models import Book
def make_csv_view(request):
	response = HttpResponse(content_type = 'text/csv')
	response['Content-Disposition'] = 'attachment;filename="mybook.csv"'
	all_book = Book.objects.all()
	writer = csv.writer(response)
	writer.writerow(['id','title'])
	for b in all_book:
		writer.writerow([b.id,b.title])
	return response

练习:结合分页功能,在test_page页面添加‘生成csv’的链接,在指定页中点击该链接,生成当前页的csv数据,供用户下载。

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

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

相关文章

研究 “B表里的数据是否全部都在A表里“ 的问题

背景 研究 “B表里的数据是否全部都在A表里” 的问题&#xff0c;那种写法比较合理效率高&#xff1f; 假设有A表和B表&#xff0c;B表通过自身外键和A表关联&#xff0c;查出B表中的外键值不在A中的。 过程 假设我们有t_master和t_pet表&#xff0c;即主人和宠物表&#x…

TPM密钥管理、使用

前面讲过证书相关内容&#xff0c;除了在软件方面有所应用外&#xff0c;在硬件方面也有很多应用。本次讲一下TPM相关的内容。 一、TPM介绍 1.1背景 TCG基于硬件安全的架构是为应对1990s后期日益增多的复杂恶意软件攻击应用而生的。当时以及现在&#xff0c;抵御PC客户端网络…

蓝桥杯刷题025——推导部分和(加权并查集)

2022省赛 问题描述 对于一个长度为 N 的整数数列 ​, 小蓝想知道下标 l 到 r 的部 分和是多少? 然而, 小蓝并不知道数列中每个数的值是多少, 他只知道它的 M 个部分和 的值。其中第 i 个部分和是下标 ​ 到 的部分和 , 值是 。 输入格式 第一行包含 3 个整数 N、M 和 Q 。分…

Java 如何通过JDBC 操作MySQL数据库

Java 如何通过JDBC 操作MySQL数据库开发准备实际开发1&#xff0c;加载并注册JDBC 驱动2&#xff0c;创建数据库连接3&#xff0c;创建Statement 对象4&#xff0c;遍历查询结果5&#xff0c;关闭连接&#xff0c;释放资源完整代码实现JDBC 是Java 数据库连接&#xff0c;即 Ja…

客户服务知识库的最佳实践7个步骤

每个公司的声誉都依赖于客户&#xff0c;如果客户因为想要购买你的产品找到你&#xff0c;但是了解到你的客户服务做的不好&#xff0c;可能也会放弃你的产品&#xff0c;就像市场营销依赖于潜在客户的关系一样&#xff0c;公司的服务部门也需要依赖于现有客户的关系&#xff0…

OCT 医学图像分类

目录1. OCT 图像分类2. OCT图像数据集3. OCT图像预处理4. 特征提取5. 实验结果及分析github地址: https://github.com/aishangcengloua/OCT_Classification 1. OCT 图像分类 视网膜光学相干断层扫描(OCT)是一种成像技术&#xff0c;用于捕获活体患者视网膜的高分辨率横截面。…

Skywalking8.5.0-ES7 Rancher部署及ES高可用部署过程记录

背景 近期本司内部需要用到Skywalking进行链路追踪和日志收集&#xff0c;故记录下部署过程&#xff0c;方便后期学习与查询。 ElasticSearch高可用部署 ## &#xff11;.docker启动elasticsearch,并将内存设置的稍微大一些,然后进行端口和配置文件映射 docker run --name…

windows 安装Qt

下载 下载地址https://download.qt.io/&#xff0c;此文已5.7.0为例子。 根据图片依次选择即可。 安装 安装过程参考另一篇文章Ubuntu 安装 Qt5.7.0即可 配置环境变量 ps&#xff1a;我就是之前没配置环境变量&#xff0c;直接使用创建项目&#xff0c;项目源码直接运行是…

Shader Graph简介

使用着色器&#xff08;shader&#xff09;和材质&#xff08;material&#xff09;&#xff0c;我们能够创造出非常多有趣的效果。除了Unity自带的shader外&#xff0c;还可以自己编写shader或使用其他人所编写的shader。编写shader通常需要我们了解shader编程语言的语法和相关…

IO流详解及常用方法

1.1. 什么是IO流IO流&#xff1a; Input/Output Stream流: 指的是一串流动的数据&#xff0c; 在数据在流中按照指定的方向进行流动。 实现数据的读取、写入的功能。1.2. IO流的使用场景使用File类&#xff0c; 只能做关于文件的操作&#xff0c; 获取属性、 创建文件、 删除文…

数字化时代,如何做好用户体验与应用性能管理

引言 随着数字化时代的到来&#xff0c;各个行业的应用系统从传统私有化部署逐渐转向公有云、行业云、微服务&#xff0c;这种变迁给运维部门和应用部门均带来了较大的挑战。基于当前企业 IT 运维均为多部门负责&#xff0c;且使用多种运维工具&#xff0c;因此&#xff0c;当…

[numpy算法复现]-第27节 Apriori算法原理(相关性)

文章目录 0. 结论1. 算法起源2. Apriori算法思想2.1 算法综述2.2 示例0. 结论 Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合的模式有助于我们做一些决策。比如在常见的超市购物数据集,或者电商的网购数据集中,如果…

公会发展计划(GAP)第三季

继前两季发布的公会发展计划取得成功之后&#xff0c;Yield Guild Games 现在推出了第三季的公会发展计划&#xff08;GAP&#xff09;。GAP 在第二季有了显著的增长&#xff0c;有超过 3000 个成就 NFT 被铸造。GAP 是以成就为导向的社区代币分配协议&#xff0c;下一次迭代将…

实验一 基于MATLAB语言的线性离散系统的Z变换分析法

实验一 基于MATLAB语言的线性离散系统的Z变换分析法 一、实验目的 1. 学习并掌握 Matlab 语言离散时间系统模型建立方法&#xff1b; 2&#xff0e;学习离散传递函数的留数分析与编程实现的方法&#xff1b; 3&#xff0e;学习并掌握脉冲和阶跃响应的编程方法&#xff1b;…

智慧校园:电子班牌+家长端小程序源码

说到智慧校园家长端微信小程序大家有多少了解呢?它有哪些优点和功能呢&#xff1f; 下面就来说说智慧校园家长端微信小程序的特色和优点。 1.学生通过闸机人脸、刷卡进出校&#xff0c;如出校则推送给家长小程序孩子已离校的信息&#xff0c;如进校则实时推送孩子已进校信息…

解决Visual Studio Code 热键冲突

因为最近很火的ChatGPT&#xff0c;更新了VSCode的版本&#xff0c;但是界面和配置有了一些变化&#xff0c;原来的热键也有所调整&#xff0c;在使用markdown的时候&#xff0c;enter键竟然都出现了冲突&#xff0c;在此记录一下操作步骤&#xff0c;非常简单。 报错如下&…

为什么要用数据库视图?

视图的定义 视图&#xff08;View&#xff09;是一种虚拟的表&#xff0c;其结构和数据来自于一个或多个基本表&#xff0c;可以被当作普通表一样进行查询操作&#xff0c;但实际上不存储任何数据。在数据库中&#xff0c;视图可以被看作是一种数据访问的方式&#xff0c;它可…

16.hadoop系列之MapReduce之MapTask与ReduceTask及Shuffle工作机制

1.MapTask工作机制 以上内容我们之前文章或多或少介绍过&#xff0c;就已网络上比较流行的该图进行理解学习吧 MapTask分为五大阶段 Read阶段Map阶段Collect阶段溢写阶段Merge阶段 2.ReduceTask工作机制 ReduceTask分为三大阶段 Copy阶段Sort阶段Reduce阶段 3.ReduceTask并…

eBPF双子座:天使or恶魔?

启示录 新约圣经启示录认为&#xff1a;恶魔其实本身是天使&#xff0c;但炽天使长路西法背叛了天堂&#xff0c;翅膀变成了黑色&#xff0c;坠落地狱&#xff0c;堕落成为恶魔。这些恶魔主宰著黑暗势力&#xff0c;阻碍人类与上帝沟通&#xff0c;无所不用其极。所以可以说天…

box-shadow详解

box-shadow详解 属性定义及使用说明 box-shadow属性可以设置一个或多个下拉阴影的框。 语法 box-shadow: h-shadow v-shadow blur spread color inset;注意&#xff1a;boxShadow 属性把一个或多个下拉阴影添加到框上。该属性是一个用逗号分隔阴影的列表&#xff0c;每个阴…