中间件定义:

  中间件是一个、一个的管道,如果相对任何所有的通过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、自定义中间件

aaarticlea/png;base64,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" alt="" />\

 
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):
pass
def process_response(self, request, response):
print 'Testmiddle process_response'
return response class 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):
pass
def 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)

中间件和Django缓存的更多相关文章

  1. django 缓存、中间件、信号、CSRF 详解

    中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项 ...

  2. Django缓存机制

    缓存介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增删改查,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的后台操作,都会消耗很多的服务 ...

  3. django缓存、信号、序列化

    本篇导航: Django的缓存机制 Django的信号 Django的序列化 一.Django的缓存机制 1.缓存介绍 1)缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增, ...

  4. 版本控制,django缓存,跨域问题解决

    复习 分页: 1. 简单分页 2. 偏移分页 3. 加密分页 解析器:客户处理前端提交来的数据 urlencode: body体中的数据格式: key=value& formdata编码:为区 ...

  5. Django 缓存

    官方文档 缓存的出现就是为了减轻对数据库的压力和加快内存访问的速度.我们的访问请求最终都是返回一个大的字符串,缓存就是将这段字符串直接存储起来,下次你来了,不用经过view去数据库或者内存拿到数据再渲 ...

  6. 一.rest-framework之版本控制 二、Django缓存 三、跨域问题 四、drf分页器 五、响应器 六、url控制器

    一.rest-framework之版本控制 1.作用 用于版本的控制 2.内置的版本控制 from rest_framework.versioning import QueryParameterVer ...

  7. Django缓存设置

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

  8. Django缓存系统

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

  9. Django - 缓存应用

    Django缓存应用: https://www.cnblogs.com/zuoshoushizi/p/7850281.html https://www.cnblogs.com/alice-bj/p/9 ...

随机推荐

  1. React中this.setState是同步还是异步?为什么要设计成异步?

    在使用react的时候,this.setState为什么是异步呢? 一直以来没有深思这个问题.昨天就此问题搜索了一下. react创始人之一 Dan Abramovgaearon在GitHub上回答了 ...

  2. JAVAEE 第七周

    JSON语法: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集 ...

  3. C#异常:未将对象引用设置到对象的实例。

    异常:未将对象引用设置到对象的实例. 一般是定义的变量或者数组等,没有赋初始值. 赋初始值后问题解决.

  4. springboot 热部署

    1 pom文件添加 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  5. 七月在线爬虫班学习笔记(二)——Python基本语法及面向对象

    第二课主要内容如下: 代码格式 基本语法 关键字 循环判断 函数 容器 面向对象 文件读写 多线程 错误处理 代码格式 syntax基本语法 a = 1234 print(a) a = 'abcd' ...

  6. linux - man 提示:No entry for tty in section 4 of the manual

    在使用man手册时,出现空章节的情况: 如: 原因:在CentOS6.5安装时,采用了minimal方式安装,许多包都没有安装上,man手册的man-pages包也没有安装 解决方案:安装man-pa ...

  7. IntelliJ IDEA 使用教程(2019图文版) -- 从入门到上瘾

    IntelliJ IDEA 使用教程(2019图文版) -- 从入门到上瘾   前言:IntelliJ IDEA 如果说IntelliJ IDEA是一款现代化智能开发工具的话,Eclipse则称得上是 ...

  8. 自建 yum 源

    生产环境需要大规模的安装部署rpm包,每次安装,更新,都需要上传,安装,比较麻烦,可以在生产环境中自建一个yum源. 1.http安装 yum -y install httpd systemctl s ...

  9. python模块之os_sys_动态导入_包

    os模块: #!/usr/bin/env python # coding:utf-8 import os print(os.getcwd()) #获取当前工作目录,即当前python脚本工作的目录路径 ...

  10. 用 Cobertura 测量测试覆盖率

      尽管测试先行编程(test-first programming)和单元测试已不能算是新概念,但测试驱动的开发仍然是过去 10 年中最重要的编程创新.最好的一些编程人员在过去半个世纪中一直在使用这些 ...