一、配置缓存

https://www.jb51.net/article/124434.htm

二、缓存全站、页面、局部
三、自我控制的简单缓存API
  • API 接口为:django.core.chache

    存接口:cache.set(key, value, time_out)

    取接口:cache.get(key)

django中的低层次缓存API

有些时候,对整个经解析的页面进行缓存并不会给你带来太多好处,事实上可能会过犹不及。

比如说,也许你的站点所包含的一个视图依赖几个费时的查询,每隔一段时间结果就会发生变化。 在这种情况下,使用站点级缓存或者视图级缓存策略所提供的整页缓存并不是最理想的,因为你可能不会想对整个结果进行缓存(因为一些数据经常变化),但你仍然会想对很少变化的部分进行缓存。

针对这样的情况,Django提供了简单低级的缓存API。 你可以通过这个API,以任何你需要的粒度来缓存对象。 你可以对所有能够安全进行 pickle 处理的 Python 对象进行缓存: 字符串、字典和模型对象列表等等。 (查阅 Python 文档可以了解到更多关于 pickling 的信息。)

缓存模块django.core.cache拥有一个自动依据CACHE_BACKEND设置创建的django.core.cache对象。

使用缓存须知:默认调用settings 中的缓存配置

如果取的key不存在默认返回None

cache.get() 接受缺省参数:cache.get('my_key', 'has expired')

不存在将返回:'has expired'

自动删除没有设置超时时间、或者没超时的key
  • cache.delete(key)

     

    可以用 cache.delete() 显式地删除关键字:

     

    cache.delete('a')

也可以使用incr()或者decr()来增加或者减少已经存在的键值。 默认情况下,增加或减少的值是1。可以用参数来制定其他值。 如果尝试增减不存在的键值会抛出ValueError。

>>> cache.set('num', 1)
>>> cache.incr('num')
2
>>> cache.incr('num', 10)
12
>>> cache.decr('num')
11
>>> cache.decr('num', 5)
  • 注意:

     

    incr()/decr()方法不是原子操作。 在支持原子增减的缓存后端上(最著名的是memcached),增减操作才是原子的。 然而,如果后端并不原生支持增减操作,也可以通过取值/更新两步操作来实现。

 

3.2 rest_framework 源码解析
  • rest_framework中节流源码使用的就是django提供的缓存api
    def dispatch(self, request, *args, **kwargs):
...
self.args = args
self.kwargs = kwargs
############################################################## request = self.initialize_request(request, *args, **kwargs) # 1.封装request #封装后的request对象
#return Request(
# request,
# parsers=self.get_parsers(),
# authenticators=self.get_authenticators(), #获取认证对象
# negotiator=self.get_content_negotiator(),
# parser_context=parser_context
#) #############################################################
self.request = request
self.headers = self.default_response_headers # deprecate? try:
############################################################## self.initial(request, *args, **kwargs) #2 初始化认证 ##############################################################
...
except Exception as exc:
...
return self.response
  • 再看#2 self.initial(request, *args, **kwargs) 初始化各种认证的过程
    def initial(self, request, *args, **kwargs):
..... # Ensure that the incoming request is permitted self.perform_authentication(request) #3.在这儿实现认证 self.check_permissions(request) #4.权限检查 self.check_throttles(request) #5.访问频率控制
  • 重点看#5处,里面循化认证了频率控制:这儿就不贴出#5中的源码了

    直接将循环的类中去查看:from rest_framework.throttling import SimpleRateThrottle
class SimpleRateThrottle(BaseThrottle):
...
#实际是:from django.core.cache import cache as default_cache
cache = default_cache #可以看到这儿就是调用django提供的缓存api
...
scope = None #这儿是配置频率,可以到配置文件中去配置,也可以继承类重写:如3/m
... def get_cache_key(self, request, view):
"""
必须重写该方法,将缓存的 key返回:常用用户名、IP等做访问频率的控制
如:
return request.META.remote_addr() 或者 用户名
"""
raise NotImplementedError('.get_cache_key() must be overridden') def get_rate(self):
#从配置文件中拿出访问频率
... def parse_rate(self, rate):
#解析配置文件中的访问频率文本
... def allow_request(self, request, view):
#访问频率的控制,认证
... if self.rate is None:
return True self.key = self.get_cache_key(request, view) #从我们重写的方法中拿到缓存key
if self.key is None:
return True self.history = self.cache.get(self.key, []) #从缓存中拿出用该key存的数据
self.now = self.timer() ...
return self.throttle_success() def throttle_success(self):
#认证成功,重新设置缓存
...
self.history.insert(0, self.now)
self.cache.set(self.key, self.history, self.duration) #重新设置缓存
return True

 

3.2.2 总结rest_framework中的频率控制流程,及cache的使用
  1. 引入rest_framework: from rest_framework import APIView

    APIView继承了Django中的View 也就是CBV中的View

     

    引入:SimpleThrottle:from rest_framework.throttling import SimpleThrottle

    自己的类继承SimpleThrottle:并重写 get_cache_key(self, request, view)方法,以及scope 访问频率

    如果全局使用就配置到settings.py中:DEFALUT_THROTTLE_CLASSES = [自己的访问频率控制类, ]

    如果局部:就在继承了APIView中的类:throttle_classes = [自己的访问频率控制类,]

  2. APIView 中dispatch方法封装了reqeust对象,initialize_request(request, *args, **kwargs)

    初始化方法: self.initial(request, *args, **kwargs) 初始化认证

     

    self.perform_authentication(request) #3.在这儿实现认证

     

    self.check_permissions(request) #4.权限检查

    &nbsp

    self.check_throttles(request) #5.访问频率控制

     

    def check_throttles(self, request):

    ...

    for throttle in self.get_throttles(): #循环认证我们自己的访问频率控制类

    ....if not throttle.allow_request(request, self): #调用里面的allow_request 方法

    ........self.throttled(request, throttle.wait()) #抛出异常

  3. SimpleThrottle中:cache = default_cache 调用系统提供的cache-api接口

    重写get_cache_key方法,返回自己将用来存储缓存的key

Django缓存机制--rest_framework中节流源码使用的就是django提供的缓存api的更多相关文章

  1. 【转载】Android异步消息处理机制详解及源码分析

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  2. 【原】Spark中Master源码分析(二)

    继续上一篇的内容.上一篇的内容为: Spark中Master源码分析(一) http://www.cnblogs.com/yourarebest/p/5312965.html 4.receive方法, ...

  3. 基于Redis缓存的Session共享(附源码)

    基于Redis缓存的Session共享(附源码) 在上一篇文章中我们研究了Redis的安装及一些基本的缓存操作,今天我们就利用Redis缓存实现一个Session共享,基于.NET平台的Seesion ...

  4. 动态代理以及对应Spring中AOP源码分析

    AOP(面向切面编程)在Spring中是被广泛应用的(例如日志,事务,权限等),而它的基本原理便是动态代理. 我们知道动态代理有两种:基于JDK的动态代理以及基于CGlib动态代理.以下是两种动态代理 ...

  5. Android应用AsyncTask处理机制详解及源码分析

    1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知识点.前面我们分析了Handler异步机制原理(不了解的可以阅读我的<Android异步消息处理机 ...

  6. 【转载】Android应用AsyncTask处理机制详解及源码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个 ...

  7. go 中 select 源码阅读

    深入了解下 go 中的 select 前言 1.栗子一 2.栗子二 3.栗子三 看下源码实现 1.不存在 case 2.select 中仅存在一个 case 3.select 中存在两个 case,其 ...

  8. 【原】Spark中Client源码分析(二)

    继续前一篇的内容.前一篇内容为: Spark中Client源码分析(一)http://www.cnblogs.com/yourarebest/p/5313006.html DriverClient中的 ...

  9. 【原】 Spark中Worker源码分析(二)

    继续前一篇的内容.前一篇内容为: Spark中Worker源码分析(一)http://www.cnblogs.com/yourarebest/p/5300202.html 4.receive方法, r ...

随机推荐

  1. ps 命令的十个简单用法

    注记 ps 命令有两种不同的语法风格 -- BSD 与 UNIX 两种风格.新手常常对这两种形式产生误解,因此我们有必要在这里作一个简单的说明: ps aux 与 ps -aux 是不同的,例如 -u ...

  2. .Net语言 APP开发平台——Smobiler学习日志:如何调用API进行短信发送

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 二.发送短信代码 VB: Pr ...

  3. Linux几个常用的目录结构

    记录几个个人觉得需要了解的目录结构含义: /lost+found: 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件. /media: linux系统会自动识别一些设备,例如U盘.光驱 ...

  4. Java开发笔记(五十七)因抽象方法而产生的抽象类

    前面介绍了类的常见用法,令人感叹面向对象的强大,几乎日常生活中的所有事物,都可以抽象成Java的基类及其子类.然而抽象操作也有副作用,就是某个抽象而来的行为可能是不确定的,比如半夜鸡叫,如果是公鸡则必 ...

  5. Java 由浅入深GUI编程实战练习(二)

    一,项目简介 1.利用Java GUI 绘制图像界面,设置整体布局 2.编写一个随机数生成1~100的随机数 3.编写一个验证类,用于验证用户输入值与生成随机数是否相等并记录用户猜测次数,当用户猜测成 ...

  6. Zookeeper 分布式机器部署

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  7. JQuery显示,隐藏和淡入淡出效果

    为了把JQuery搞熟悉,看着菜鸟教程,一个一个例子打,边看边记,算是一晚上的一个小总结吧.加油,我很本但是我很勤奋啊.系统的了解它,就要花时间咯. <!DOCTYPE html> < ...

  8. pthread_exit在main线程中的用处

    在main线程中调用pthread_exit会起到只让main线程退出,但是保留进程资源,供其他由main创建的线程使用,直至所有线程都结束,但在其他线程中不会有这种效果 https://stacko ...

  9. pwn with glibc heap(堆利用手册)

    前言 ​ 对一些有趣的堆相关的漏洞的利用做一个记录,如有差错,请见谅. ​ 文中未做说明 均是指 glibc 2.23 ​ 相关引用已在文中进行了标注,如有遗漏,请提醒. 简单源码分析 ​ 本节只是简 ...

  10. python模块--zipfile文件压缩

    zipfile模块是python中一个处理压缩文件的模块,解决了不少我们平常需要处理压缩文件的需求 ,本文主要谈谈zipfile几个常用的用法. 首先我在Windows操作系统中创建如下的文件目录: ...