中间件定义:

  中间件是一个、一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件

  中间件可以对进来的请求和出去的请求进行控制

  中间件是一类。

看下面的代码在settings里中间件的类:

MIDDLEWARE_CLASSES = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.auth.middleware.SessionAuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

当有请求过来的时候,默认从上倒下执行!然后在返回的时候从下面在返回回去,如下图:

2、自定义中间件

中间件中可以定义四个方法,分别是:

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

process_exception 这个方法只有在出现错误的时候才会触发

先写一个自定义中间件,然后在看他的原理和源码:

2.1、自定义中间件

\

class Testmiddle(object):def process_request(self,request):print 'Testmiddle process_request'def process_view(self, request, callback, callback_args, callback_kwargs):print 'Testmiddle process_view'def process_exception(self, request, exception):passdef process_response(self, request, response):print 'Testmiddle process_response'return responseclass Nextmiddle(object):def process_request(self,request):print 'Nextmiddle process_request'def process_view(self, request, callback, callback_args, callback_kwargs):print 'Nextmiddle process_view'def process_exception(self, request, exception):passdef process_response(self, request, response):print 'Nextmiddle process_response'return response

2.2、注册中间件

MIDDLEWARE_CLASSES = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.auth.middleware.SessionAuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','middleware.middle.Testmiddle','middleware.middle.Nextmiddle',
]

2.3、测试使用url和views

from app01 import views
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/$', views.index),]

def index(request):print 'This app01 Views.index'return HttpResponse('OK')

2.4、查看输出结果:

'''
Testmiddle process_request
Nextmiddle process_request
Testmiddle process_view
Nextmiddle process_view
This app01 Views.index
Nextmiddle process_response
Testmiddle process_response
'''

从输出结果可以看出:

他是先执行Testmiddle 的request 方法又执行了Nextmiddle的 process_request方法。。。。

2.5、原理:

当请求进来了到达中间件

去settings里面找到MIDDLEWARE_CLASSES,MIDDLEWARE_CLASSES是一个元组

有4个列表:

process_request_lsit = []
process_view_list = []
process_response_list = []
然后他循环MIDDLEWARE_CLASSES这个类:
for 类 in MIDDLEWARE_CLASSES:obj = 类()if obj里有process_request方法:process_request_lsit.append(obj.process_request)

然后循环后后执行:

for i in process_request_list:i() #加括号执行方法for i in process_view_list:i() ............

3、中间件的流程梳理

首先看下自定义的中间件中的process_response方法他是有返回值的其他的是没有返回值的。这个return response是什么呢?

这个response就是咱们自定义的views.index返回的结果!

    def process_response(self, request, response):print 'Testmiddle process_response'return response

如果在其他的没有返回值得,仅有process_response有返回值得话他的请求流程是这样的:

但是如果在process_request或者process_view又返回值得话那么流程就完全不一样了!

举例:如果有m1和m2两个中间件,如果我在m1中的request方法中设置了,如果访问为1.1.1.1那么返回要一个404,那么他的访问流程是这样的:

process_exception  什么时候触发呢?咱们定义的views.index出错的时候他就会捕捉到然后执行咱们定义的process_exception方法如下图:

Django缓存

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者Redis中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

举个例子来说:如果访问量比较大的时候,有很多相同的操作比如:有时候请求的数据比如访问同一条数据,或者同一个页面的时候,其实是没必要的。

Django支持,mysql,Redis、Memecache、文件的方式做缓存,并且可以设置超时时间。

settings配置:

CACHES = {'default': {#定义已文件的方式进行cache'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',#cache文件的存放路径'LOCATION': os.path.join(BASE_DIR, 'cache'),#超时时间为600妙'TIMEOUT': 600,'OPTIONS': {'MAX_ENTRIES': 1000}}
}

给请求应用,就是使用装饰器

from django.views.decorators.cache import cache_page#这里设置的是 60秒 * 15 ,15分钟之后
@cache_page(60 * 15)
def cache_page(request):current = str(time.time())return HttpResponse(current)

转载于:https://www.cnblogs.com/zjltt/p/7573581.html

中间件和Django缓存相关推荐

  1. Django缓存机制

    Django缓存机制三个粒度:1 全站缓存 settings.py 全局配置文件用中间件:MIDDLEWARE = [# 'django.middleware.cache.UpdateCacheMid ...

  2. pythonのdjango 缓存

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...

  3. Django缓存设置

    由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...

  4. Django 缓存 Cache

    文章目录 一.缓存 二.Django 缓存应用场景 三.Django 缓存的五种配置 0.通用配置(以redis为例) 1.开发调试 2.将缓存信息保存至文件 3.将缓存信息保存至内存 4.将缓存信息 ...

  5. Django缓存系统

    为什么要做django缓存? 在动态网站中,用户每次请求一个页面,服务器都会执行以下操作:查询数据库,渲染模板,执行业务逻辑,最后生成用户可查看的页面. 这会消耗大量的资源,当访问用户量非常大时,就要 ...

  6. Django缓存清理和缓存设置

    Django缓存清理和缓存设置 缓存清理 方法很多,提供两个思路 1.直接去清理用来存缓存的介质,如memcached.redis() 2.自己写程序脚本清空. 3.使用django-extensio ...

  7. Django 缓存系统

    Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多. 缓存系统工 ...

  8. drf版本控制 和django缓存,跨域问题,

    drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ...

  9. Django 缓存----数据库缓存

    Django 缓存----数据库缓存 1. 在dajngo的setting那加入你想缓存的配置 CACHES = {#这是默认的,不能删除,个人试过会报没有这个默认配置的错'default': {'B ...

最新文章

  1. 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书
  2. 「Tensorflow」错误tensorflow.python.framework.errors_impl.UnknownError: 2 root error(s) found.
  3. 解决Eclipse报errors running builder ‘javascript validator’ on project
  4. exists hive中如何使用_07045.16.2如何使用Hive合并小文件
  5. 使用JVM钩子函数关闭资源
  6. jQuery 图表插件 jqChart 使用
  7. android消息,android消息机制
  8. Linux下squid代理缓存服务环境部署
  9. Centos5.8 安装 Redmine
  10. c语言五子棋双链表,五子棋的悔棋函数怎么写啊。。。双击鼠标左键悔棋(菠萝镇楼)...
  11. 刚体的转动惯量的c语言题目,刚体的转动惯量题.doc
  12. 【排行榜】苏州配眼镜推荐这四类口碑眼镜店
  13. pythonsze_python学习笔记二 数据类型(基础篇)
  14. 【RGBCW五路调光投光灯照明方案】 共阳极无频闪调光驱动IC 内置MOS降压恒流LED驱动芯片FP7122
  15. 清闲的工作与温水煮青蛙;-)
  16. E.A. Guillemin 吉耶曼统一古典电路理论的人
  17. 关于使用Artery插件的一些积累1
  18. QQ找茬辅助工具 C#
  19. 潘云鹤院士:人工智能走向2.0的本质原因——人类世界正由二元空间变成三元空间...
  20. 度言外呼系统服务器错误,电话外呼营销系统,电话营销获客的一把“利剑”

热门文章

  1. Windows多屏开发小记
  2. zend studio使用xdebug调试程序不能单步调试的解决方案
  3. 《Windows 8 权威指南》——1.3 引入全新内核休眠模式,实现“瞬间开机”
  4. 转Git学习碰到的问题
  5. dispatch_sync
  6. Java各种日期计算
  7. Exar签署最终协议 5900万美元收购Hifn
  8. intval0.57100 php_关于PHP浮点数之 intval((0.1+0.7)*10) 为什么是7
  9. 东芝复印机2303出现f070_东芝复印机维修代码大全
  10. vue add element报错_Vue 源码解析 -- new Vue -gt; mountComponent 001