django中间件有哪些提供了哪

扫一扫体验手机阅读
django中间件
<span type="1" blog_id="2082843" userid='
135篇文章,22W+人气,12粉丝Django中间件的详细介绍
&#xe609;原创
&#xe60e; 10:49:55
&#xe756;621
写了几周的脚本,今天终于开始接触web框架了~学习Python的web框架,那么Django就几乎是必修课了,这次的工作是先打打下手,主要的任务是在setting中添加版本号,在渲染静态css,js的路径时附带版本号,例如“example.v1124.css”,然后再在request请求中祛除掉版本号。为什么要这么做呢?因为这样做的话在前端输出静态文件的路径就会加上就会加上版本号,这样当开发出新的静态文件的时候,客户端就会强制刷新本地的缓存,为了达到这个目的就要首先要在settings文件中配置,这样就可以每次修改的时候直接从settings读取版本号了一、Django中间件的请求周期我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下:也就是说,每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回前者,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上。二、自定义及注册中间件1. 创建中间件在project根目录下创建中间件py文件: 1 class RequestExeute(object): 2
def process_request(self, request): 3
print(&#39;process_request&#39;) 4
def process_view(self, request, callback, callback_args, callback_kwargs): 6
print(&#39;process_view&#39;) 7
def process_exception(self, request, exception): 9
当views函数出错时执行11
:param request:
:param exception:
print(&#39;process_exception&#39;)16
def process_response(self, request, response):18
必须return HttpResponse20
:param request:
:param response:
print(&#39;process_response&#39;)25
return response26 27
def process_template_response(self, request, response):28
视图函数的返回值中,如果有render方法,才被调用30
:param request:31
:param response:32
:return:33
print(&#39;process_template_response&#39;)35
return responsemd.py2. 注册中间件在settings.py文件中,按照欲执行的顺序注册:ps. 在1.9及之前的版本中,中间件的关键字为:MIDDLEWARE_CLASSESMIDDLEWARE_CLASSES = (&#39;zqxt.middleware.BlockedIpMiddleware&#39;,
...其它的中间件
)三、中间件中方法的执行顺序1. 正常状况 1 from django.shortcuts import HttpResponse 2 from django.utils.deprecation import MiddlewareMixin 3 class M1(MiddlewareMixin): 4
def process_request(self, request): 5
print(&#39;m1.request&#39;) 6
# return HttpResponse(&#39;request_m1&#39;) 7
def process_view(self, request, callback, callback_args, callback_kwargs): 9
print(&#39;m1.view&#39;)10
# response = callback(request, *callback_args, **callback_kwargs)11
# return response12 13
def process_response(self, request, response):14
print(&#39;m1.response&#39;)15
return response16 17
def process_exception(self, request, exception):18
print(&#39;m1.process_exception&#39;)19
return HttpResponse(&#39;m1.process_exception&#39;)20 21
def process_template_response(self, request, response):22
视图函数的返回值中,如果有render方法,才被调用24
:param request:25
:param response:26
:return:27
print(&#39;m1.process_template_response&#39;)29
return response30 31 32 class M2(MiddlewareMixin):33
def process_request(self, request):34
print(&#39;m2.request&#39;)35 36
def process_view(self, request, callback, callback_args, callback_kwargs):37
print(&#39;m2.view&#39;)38
# response = callback(request, *callback_args, **callback_kwargs)39
# return response40 41
def process_response(self, request, response):42
print(&#39;m2.response&#39;)43
return response44 45
def process_exception(self, request, exception):46
print(&#39;m2.process_exception&#39;)47
return HttpResponse(&#39;m2.process_exception&#39;)48 49
def process_template_response(self, request, response):50
视图函数的返回值中,如果有render方法,才被调用52
:param request:53
:param response:54
:return:55
print(&#39;m2.process_template_response&#39;)57
return responseprocess_request和process_view返回None执行顺序:m1.requestm2.requestm1.viewm2.viewm2.responsem1.response2. 在版本1.10及之后若process_request返回HttpResponse 对象,则从当前中间件的process_response向前返回 1 from django.shortcuts import HttpResponse 2 from django.utils.deprecation import MiddlewareMixin 3 class M1(MiddlewareMixin): 4
def process_request(self, request): 5
print(&#39;m1.request&#39;) 6
return HttpResponse(&#39;request_m1&#39;) 7
def process_view(self, request, callback, callback_args, callback_kwargs): 9
print(&#39;m1.view&#39;)10
# response = callback(request, *callback_args, **callback_kwargs)11
# return response12 13
def process_response(self, request, response):14
print(&#39;m1.response&#39;)15
return response16 17
def process_exception(self, request, exception):18
print(&#39;m1.process_exception&#39;)19
return HttpResponse(&#39;m1.process_exception&#39;)20 21
def process_template_response(self, request, response):22
视图函数的返回值中,如果有render方法,才被调用24
:param request:25
:param response:26
:return:27
print(&#39;m1.process_template_response&#39;)29
return response30 31 32 class M2(MiddlewareMixin):33
def process_request(self, request):34
print(&#39;m2.request&#39;)35 36
def process_view(self, request, callback, callback_args, callback_kwargs):37
print(&#39;m2.view&#39;)38
# response = callback(request, *callback_args, **callback_kwargs)39
# return response40 41
def process_response(self, request, response):42
print(&#39;m2.response&#39;)43
return response44 45
def process_exception(self, request, exception):46
print(&#39;m2.process_exception&#39;)47
return HttpResponse(&#39;m2.process_exception&#39;)48 49
def process_template_response(self, request, response):50
视图函数的返回值中,如果有render方法,才被调用52
:param request:53
:param response:54
:return:55
print(&#39;m2.process_template_response&#39;)57
return response58 59 60 # class RequestExeute(object):61 #
def process_request(self, request):62 #
print(&#39;process_request&#39;)63 #64 #
def process_view(self, request, callback, callback_args, callback_kwargs):65 #
print(&#39;process_view&#39;)66 #67 #
def process_exception(self, request, exception):68 #
当views函数出错时执行70 #
:param request:71 #
:param exception:72 #
:return:73 #
print(&#39;process_exception&#39;)75 #76 #
def process_response(self, request, response):77 #
必须return HttpResponse79 #
:param request:80 #
:param response:81 #
:return:82 #
print(&#39;process_response&#39;)84 #
return response85 #86 #
def process_template_response(self, request, response):87 #
视图函数的返回值中,如果有render方法,才被调用89 #
:param request:90 #
:param response:91 #
:return:92 #
print(&#39;process_template_response&#39;)94 #
return responseM1的process_request返回HttpResponse执行顺序:m1.requestm1.responseprocess_view与process_request类似: 1 from django.shortcuts import HttpResponse 2
from django.utils.deprecation import MiddlewareMixin 3 class M1(MiddlewareMixin): 4
def process_request(self, request): 5
print(&#39;m1.request&#39;) 6
# return HttpResponse(&#39;request_m1&#39;) 7
def process_view(self, request, callback, callback_args, callback_kwargs): 9
print(&#39;m1.view&#39;)10
response = callback(request, *callback_args, **callback_kwargs)11
return response12 13
def process_response(self, request, response):14
print(&#39;m1.response&#39;)15
return response16 17
def process_exception(self, request, exception):18
print(&#39;m1.process_exception&#39;)19
return HttpResponse(&#39;m1.process_exception&#39;)20 21
def process_template_response(self, request, response):22
视图函数的返回值中,如果有render方法,才被调用24
:param request:25
:param response:26
:return:27
print(&#39;m1.process_template_response&#39;)29
return response30 31 32 class M2(MiddlewareMixin):33
def process_request(self, request):34
print(&#39;m2.request&#39;)35 36
def process_view(self, request, callback, callback_args, callback_kwargs):37
print(&#39;m2.view&#39;)38
# response = callback(request, *callback_args, **callback_kwargs)39
# return response40 41
def process_response(self, request, response):42
print(&#39;m2.response&#39;)43
return response44 45
def process_exception(self, request, exception):46
print(&#39;m2.process_exception&#39;)47
return HttpResponse(&#39;m2.process_exception&#39;)48 49
def process_template_response(self, request, response):50
视图函数的返回值中,如果有render方法,才被调用52
:param request:53
:param response:54
:return:55
print(&#39;m2.process_template_response&#39;)57
return responsem1的process_view返回HttpResponse执行顺序:m1.request
m2.request
m2.response
m1.respons 3. 在版本1.10之前若process_request返回HttpResponse 对象,则当前中间件之后的process_request都不会执行,而从最后一个中间件的process_response向前返回以上就是Django中间件的详细介绍的详细内容,更多请关注php中文网其它相关文章!
江湖传言:PHP是世界上最好的编程语言。真的是这样吗?这个梗究竟是从哪来的?学会本课程,你就会明白了。
PHP中文网出品的PHP入门系统教学视频,完全从初学者的角度出发,绝不玩虚的,一切以实用、有用...
ThinkPHP是国内最流行的中文PHP开发框架,也是您Web项目的最佳选择。《php.cn独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架常识开始,将...
《php.cn原创html5视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了HTML知识。
本套教程,以一个真实的学校教学管理系统为案例,手把手教会您如何在一张白纸上,从零开始,一步一步的用ThinkPHP5框架快速开发出一个商业项目。
所有计算机语言的学习都要从基础开始,《PHP入门视频教程之一周学会PHP》不仅是PHP的基础部分更主要的是PHP语言的核心技术,是学习PHP必须掌握的内容,任何PHP项目的实现都离不开这部分的内容,通...
本课以最新版ThinkPHP5.0.10为基础进行开发,全程实录一个完整企业点,从后台到前台,从控制器到路由的全套完整教程,不论是你是新人,还是有一定开发经验的程序员,都可以从中学到实用的知识~~
ThinkPHP是一个快速、开源的轻量级国产PHP开发框架,是业内最流行的PHP框架之一。本课程以博客系统为例,讲述如何使用TP实战开发,从中学习Thinkphp的实践应用。模版下载地址:http:/...
本课程是php实战开发课程,以爱奇艺电影网站为蓝本从零开发一个自己的网站。目的是让大家了解真实项目的架构及开发过程
本课以一个极简的PHP开发框架为案例,向您展示了一个PHP框架应该具有的基本功能,以及具体的实现方法,让您快速对PHP开发框架的底层实现有一个清楚的认识,为以后学习其实的开发框架打下坚实的基础。
javascript是运行在浏览器上的脚本语言,连续多年,被评为全球最受欢迎的编程语言。是前端开发必备三大法器中,最具杀伤力。如果前端开发是降龙十八掌,好么javascript就是第18掌:亢龙有悔。...
本站9月直播课已经结束,本套教程是直播实录,没有报上名或者漏听学员福利来了,赶紧看看吧,说不定这里就有你的菜
轻松明快,简洁生动,让你快速走入HTML5的世界,体会语义化开发的魅力
JavaScript能够称得上是史上使用最广泛的编程语言,也是前端开发必须掌握的三技能之一:描述网页内容的HTML、描述网页样式的CSS以及描述网页行为的JavaScript。本章节将帮助大家迅速掌握...
Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。为所有开发者、所有应用场景而设计,它让前端开发更快速、简单,所有开发者都能快速上手...
《php.cn独孤九贱(2)-css视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了CSS知识...
《php用户注册登录系统》主要介绍网站的登录注册功能,我们会从最简单的实现登录注册功能开始,增加验证码,cookie验证等,丰富网站的登录注册功能
jQuery是一个快速、简洁的JavaScript框架。设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的...
《PHP学生管理系统视频教程》主要给大家讲解了HTML,PHP,MySQL之间的相互协作,实现动态的网页显示和获取数据.
《弹指间学会HTML视频教程》从最基本的概念开始讲起,步步深入,带领大家学习HTML,了解各种常用标签的意义以及基本用法,学习HTML知识为以后的学习打下基础
《最新微信小程序开发视频教程》本节课程是由微趋道录制,讲述了如何申请一个微信小程序,以及开发中需要使用哪些工具,和需要注意哪些等。
PHP开发工程师
文章总浏览数django-中间件django-中间件旅行科技之旅百家号中间件Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。1 中间件的定义方法定义一个中间件工厂函数,然后返回一个可以别调用的中间件。中间件工厂函数需要接收一个可以调用的get_response对象。返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。def simple_middleware(get_response): # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
def middleware(request): # 此处编写的代码会在每个请求处理视图前被调用。
response = get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用。
return response
return middleware例如,在users应用中新建一个middleware.py文件,def my_middleware(get_response): print('init 被调用') def middleware(request): print('before request 被调用') response = get_response(request) print('after response 被调用') return response return middleware定义好中间件后,需要在settings.py 文件中添加注册中间件MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'users.middleware.my_middleware', # 添加中间件]定义一个视图进行测试def demo_view(request): print('view 视图被调用') return HttpResponse('OK')执行结果注意:Django运行在调试模式下,中间件init部分有可能被调用两次。2 多个中间件的执行顺序在请求视图被处理前,中间件由上至下依次执行在请求视图被处理后,中间件由下至上依次执行示例:定义两个中间件def my_middleware(get_response): print('init 被调用') def middleware(request): print('before request 被调用') response = get_response(request) print('after response 被调用') return response return middleware def my_middleware2(get_response): print('init2 被调用') def middleware(request): print('before request 2 被调用') response = get_response(request) print('after response 2 被调用') return response return middleware注册添加两个中间件MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'users.middleware.my_middleware', # 添加 'users.middleware.my_middleware2', # 添加]执行结果init2 被调用init 被调用before request 被调用before request 2 被调用view 视图被调用after response 2 被调用欢迎在评论区留言,另外,喜欢的请点点关注哦!后面的内容更精彩!本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。旅行科技之旅百家号最近更新:简介:天文学家探索宇宙奥秘作者最新文章相关文章一、中间件
1、什么是中间件?
中间件是一个、一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件
中间件可以对进来的请求和出去的请求进行控制
中间件是一类。
由上图可知,中间件是位于wsgi和路由系统中间的环节。用户请求和和回应请求都会经过中间件。
看下面的代码在settings里中间件的类:
1 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',
<span style="color: # ]
当有请求过来的时候,默认从上倒下执行!然后在返回的时候从下面在返回回去
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_template_response(self,request,response) 这个方法只有在返回对象中有render方法的时候才执行,如render_to_response('/index/')
以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。
创建中间件脚本
在django的的project目录下创建一个middleware目录,并创建一个md.py的脚本,内容如下:
1 class Testmiddle:
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):
def process_response(self, request, response):
print 'Testmiddle process_response'
<span style="color: #
return response
<span style="color: #
<span style="color: # class Nextmiddle:
<span style="color: #
def process_request(self,request):
<span style="color: #
print 'Nextmiddle process_request'
<span style="color: #
def process_view(self, request, callback, callback_args, callback_kwargs):
<span style="color: #
print 'Nextmiddle process_view'
<span style="color: #
def process_exception(self, request, exception):
<span style="color: #
<span style="color: #
def process_response(self, request, response):
<span style="color: #
print 'Nextmiddle process_response'
<span style="color: #
return response
注册中间件
修改settings.py文件,在MIDDLEWARE_CLASSES中添加我们创建的中间件
1 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',
<span style="color: #
'middleware.middle.Testmiddle',
<span style="color: #
'middleware.middle.Nextmiddle',
<span style="color: # ]
设置url 略
<span style="color: # Testmiddle process_request
<span style="color: # Nextmiddle process_request
<span style="color: # Testmiddle process_view
<span style="color: # Nextmiddle process_view
<span style="color: # This app01 Views.index
<span style="color: # Nextmiddle process_response
<span style="color: # Testmiddle process_response
从输出结果可以看出:
他是先执行Testmiddle 的request 方法又执行了Nextmiddle的 process_request方法, 然后在执行Testmiddle的view方法,Nextmiddle的view方法
注意:django版本1.10以后,会报如下错误:
解决如下:
1 from django.utils.deprecation import MiddlewareMixin
2 class Testmiddle(MiddlewareMixin):
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):
def process_response(self, request, response):
<span style="color: #
print 'Testmiddle process_response'
<span style="color: #
return response
<span style="color: #
<span style="color: # class Nextmiddle(MiddlewareMixin):
<span style="color: #
def process_request(self,request):
<span style="color: #
print 'Nextmiddle process_request'
<span style="color: #
def process_view(self, request, callback, callback_args, callback_kwargs):
<span style="color: #
print 'Nextmiddle process_view'
<span style="color: #
def process_exception(self, request, exception):
<span style="color: #
<span style="color: #
def process_response(self, request, response):
<span style="color: #
print 'Nextmiddle process_response'
<span style="color: #
return response
注意:* 老版本中在中间件中如果某个中间件类的方法返回的不是none,则后面的中间件不会再处理请求,也不会到达路由系统,而是直接到第一个process_response,开始所有的process_response处理* 新版本中在中间件中如果某个中间件类的方法返回的不是none,则后面的中间件不会再处理请求,也不会到达路由系统,而是直接到最后一个process_response处理,然后返回给客户端
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。
Django中提供了6种缓存方式:
Memcache缓存(python-memcached模块)
Memcache缓存(pylibmc模块)
1、开发调试
1 # 此为开始调试用,实际内部不做任何操作
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
'TIMEOUT': 300,
# 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
'OPTIONS':{
'MAX_ENTRIES': 300,
# 最大缓存个数(默认300)
'CULL_FREQUENCY': 3,
# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
<span style="color: #
<span style="color: #
'KEY_PREFIX': '',
# 缓存key的前缀(默认空)
<span style="color: #
'VERSION': 1,
# 缓存key的版本(默认1)
<span style="color: #
'KEY_FUNCTION' 函数名
# 生成key的函数(默认函数会生成为:【前缀:版本:key】)
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
# 自定义key
<span style="color: #
def default_key_func(key, key_prefix, version):
<span style="color: #
<span style="color: #
Default function to generate keys.
<span style="color: #
<span style="color: #
Constructs the key used by all other methods. By default it prepends
<span style="color: #
the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
<span style="color: #
function with custom key making behavior.
<span style="color: #
<span style="color: #
return '%s:%s:%s' % (key_prefix, version, key)
<span style="color: #
<span style="color: #
def get_key_func(key_func):
<span style="color: #
<span style="color: #
Function to decide which key function to use.
<span style="color: #
<span style="color: #
Defaults to ``default_key_func``.
<span style="color: #
<span style="color: #
if key_func is not None:
<span style="color: #
if callable(key_func):
<span style="color: #
return key_func
<span style="color: #
<span style="color: #
return import_string(key_func)
<span style="color: #
return default_key_func
1 # 此缓存将内容保存至内存的变量中
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
<span style="color: #
# 注:其他配置同开发调试版本
1 # 此缓存将内容保存至文件
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',
<span style="color: #
# 注:其他配置同开发调试版本
# 此缓存将内容保存至数据库
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table', # 数据库表
<span style="color: #
<span style="color: #
# 注:执行创建表命令 python manage.py createcachetable
5、Memcach缓存(python-memcached模块)
1 # 此缓存使用python-memcached模块连接memcache
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '<span style="color: #7.0.0.1:11211',
<span style="color: #
CACHES = {
<span style="color: #
'default': {
<span style="color: #
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
<span style="color: #
'LOCATION': 'unix:/tmp/memcached.sock',
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
CACHES = {
<span style="color: #
'default': {
<span style="color: #
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
<span style="color: #
'LOCATION': [
<span style="color: #
'<span style="color: #2.19.26.240:11211',
<span style="color: #
'<span style="color: #2.19.26.242:11211',
<span style="color: #
<span style="color: #
<span style="color: #
6、Memcache缓存(pylibmc模块)
1 # 此缓存使用pylibmc模块连接memcache
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': '<span style="color: #7.0.0.1:11211',
<span style="color: #
CACHES = {
<span style="color: #
'default': {
<span style="color: #
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
<span style="color: #
'LOCATION': '/tmp/memcached.sock',
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
CACHES = {
<span style="color: #
'default': {
<span style="color: #
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
<span style="color: #
'LOCATION': [
<span style="color: #
'<span style="color: #2.19.26.240:11211',
<span style="color: #
'<span style="color: #2.19.26.242:11211',
<span style="color: #
<span style="color: #
<span style="color: #
7、应用方式:
使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
<span style="color: # MIDDLEWARE = [
<span style="color: #
'django.middleware.cache.UpdateCacheMiddleware',
<span style="color: #
# 其他中间件...
<span style="color: #
'django.middleware.cache.FetchFromCacheMiddleware',
<span style="color: #
<span style="color: #
<span style="color: #
CACHE_MIDDLEWARE_ALIAS = ""
<span style="color: #
CACHE_MIDDLEWARE_SECONDS = ""
<span style="color: #
CACHE_MIDDLEWARE_KEY_PREFIX = ""
单独视图缓存
1 方式一:
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
8 方式二:
from django.views.decorators.cache import cache_page
<span style="color: #
<span style="color: #
urlpatterns = [
<span style="color: #
url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
<span style="color: #
局部视图缓存
<span style="color: # a. 引入TemplateTag
<span style="color: #
<span style="color: #
{% load cache %}
<span style="color: #
<span style="color: # b. 使用缓存
<span style="color: #
<span style="color: #
{% cache 5000 缓存key %}
<span style="color: #
<span style="color: #
{% endcache %}
Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。
1、django内置信号
1 Model signals
# django的modal执行其构造方法前,自动触发
# django的modal执行其构造方法后,自动触发
# django的modal对象保存前,自动触发
# django的modal对象保存后,自动触发
pre_delete
# django的modal对象删除前,自动触发
post_delete
# django的modal对象删除后,自动触发
m2m_changed
# django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
class_prepared
# 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
<span style="color: # Management signals
<span style="color: #
pre_migrate
# 执行migrate命令前,自动触发
<span style="color: #
post_migrate
# 执行migrate命令后,自动触发
<span style="color: # Request/response signals
<span style="color: #
request_started
# 请求到来前,自动触发
<span style="color: #
request_finished
# 请求结束后,自动触发
<span style="color: #
got_request_exception
# 请求异常后,自动触发
<span style="color: # Test signals
<span style="color: #
setting_changed
# 使用test测试修改配置文件时,自动触发
<span style="color: #
template_rendered
# 使用test测试渲染模板时,自动触发
<span style="color: # Database Wrappers
<span style="color: #
connection_created
# 创建数据库连接时,自动触发
2、对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:
1 from django.core.signals import request_finished
2 from django.core.signals import request_started
3 from django.core.signals import got_request_exception
5 from django.db.models.signals import class_prepared
6 from django.db.models.signals import pre_init, post_init
7 from django.db.models.signals import pre_save, post_save
8 from django.db.models.signals import pre_delete, post_delete
9 from django.db.models.signals import m2m_changed
<span style="color: # from django.db.models.signals import pre_migrate, post_migrate
<span style="color: #
<span style="color: # from django.test.signals import setting_changed
<span style="color: # from django.test.signals import template_rendered
<span style="color: #
<span style="color: # from django.db.backends.signals import connection_created
<span style="color: #
<span style="color: #
<span style="color: # def callback(sender, **kwargs):
<span style="color: #
print("xxoo_callback")
<span style="color: #
print(sender,kwargs)
<span style="color: #
<span style="color: #
xxoo.connect(callback)
<span style="color: #
# xxoo指上述导入的内容
<span style="color: # from django.core.signals import request_finished
<span style="color: # from django.dispatch import receiver
<span style="color: #
<span style="color: # @receiver(request_finished)
<span style="color: # def my_callback(sender, **kwargs):
<span style="color: #
print("Request finished!")
3、django自定义信号
<span style="color: # import django.dispatch
<span style="color: # pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"]
<span style="color: # def callback(sender, **kwargs):
<span style="color: #
print("callback")
<span style="color: #
print(sender,kwargs)
<span style="color: #
<span style="color: # pizza_done.connect(callback)
<span style="color: # from 路径 import pizza_done
<span style="color: #
<span style="color: # pizza_done.send(sender='seven',toppings=123, size=456)
由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发。
四、admin后台
1、admin简介:
Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有:
django.contrib.auth
django.contrib.contenttypes
django.contrib.messages
django.contrib.sessions
模板的context_processors:
django.contrib.auth.context_processors.auth
django.contrib.messages.context_processors.messages
django.contrib.auth.middleware.AuthenticationMiddleware
django.contrib.messages.middleware.MessageMiddleware
2、配置路由:
urlpatterns&=&[
&&&&&&&&url(r'^admin/', admin.site.urls),
3、当前配置的路由可以创建一些路由映射关系:
/admin//admin/login//admin/logout//admin/password_change//admin/password_change/done/
/admin/app名称/model名称//admin/app名称/model名称/add//admin/app名称/model名称/ID值/history//admin/app名称/model名称/ID值/change//admin/app名称/model名称/ID值/delete/
4、定制Admin
在admin.py中只需要讲Mode中的某个类注册,即可在Admin中实现增删改查的功能,如:
admin.site.register(models.UserInfo)
但是,这种方式比较简单,如果想要进行更多的定制操作,需要利用ModelAdmin进行操作,如:
1 方式一:
class UserAdmin(admin.ModelAdmin):
list_display = ('user', 'pwd',)
admin.site.register(models.UserInfo, UserAdmin) # 第一个参数可以是列表
8 方式二:
@admin.register(models.UserInfo)
# 第一个参数可以是列表
<span style="color: #
class UserAdmin(admin.ModelAdmin):
<span style="color: #
list_display = ('user', 'pwd',)
ModelAdmin中提供了大量的可定制功能,如
list_display,列表时,定制显示的列。
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
list_display = ('user', 'pwd', 'xxxxx')
<span style="color: #
<span style="color: #
def xxxxx(self, obj):
<span style="color: #
return "xxxxx"
list_display_links,列表时,定制列可以点击跳转。
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
list_display = ('user', 'pwd', 'xxxxx')
<span style="color: #
list_display_links = ('pwd',)
list_filter,列表时,定制右侧快速筛选。
1 from django.utils.translation import ugettext_lazy as _
3 @admin.register(models.UserInfo)
4 class UserAdmin(admin.ModelAdmin):
list_display = ('user', 'pwd')
class Ugg(admin.SimpleListFilter):
title = _('decade born')
parameter_name = 'xxxxxx'
<span style="color: #
<span style="color: #
def lookups(self, request, model_admin):
<span style="color: #
<span style="color: #
显示筛选选项
<span style="color: #
:param request:
<span style="color: #
:param model_admin:
<span style="color: #
<span style="color: #
<span style="color: #
return models.UserGroup.objects.values_list('id', 'title')
<span style="color: #
<span style="color: #
def queryset(self, request, queryset):
<span style="color: #
<span style="color: #
点击查询时,进行筛选
<span style="color: #
:param request:
<span style="color: #
:param queryset:
<span style="color: #
<span style="color: #
<span style="color: #
v = self.value()
<span style="color: #
return queryset.filter(ug=v)
<span style="color: #
<span style="color: #
list_filter = ('user',Ugg,)
list_select_related,列表时,连表查询是否自动select_related
<span style="color: # # 分页,每页显示条数
<span style="color: #
list_per_page = 100
<span style="color: #
<span style="color: # # 分页,显示全部(真实数据&该值时,才会有显示全部)
<span style="color: #
list_max_show_all = 200
<span style="color: #
<span style="color: # # 分页插件
<span style="color: #
paginator = Paginator
&list_editable,列表时,可以编辑的列
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
list_display = ('user', 'pwd','ug',)
<span style="color: #
list_editable = ('ug',)
search_fields,列表时,模糊搜索的功能
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
<span style="color: #
search_fields = ('user', 'pwd')
date_hierarchy,列表时,对Date和DateTime类型进行搜索
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
<span style="color: #
date_hierarchy = 'ctime'
preserve_filters,详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件
ave_as = False,详细页面,按钮为“Sava as new” 或 “Sava and add another”
save_as_continue = True,点击保存并继续编辑
<span style="color: # save_as_continue = True
<span style="color: #
<span style="color: # # 如果 save_as=True,save_as_continue = True, 点击Sava as new 按钮后继续编辑。
<span style="color: # # 如果 save_as=True,save_as_continue = False,点击Sava as new 按钮后返回列表。
<span style="color: #
<span style="color: # New in Django 1.10.
save_on_top = False,详细页面,在页面上方是否也显示保存删除等按钮
inlines,详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除
<span style="color: # class UserInfoInline(admin.StackedInline): # TabularInline
<span style="color: #
<span style="color: #
model = models.UserInfo
<span style="color: #
<span style="color: #
<span style="color: # class GroupAdminMode(admin.ModelAdmin):
<span style="color: #
list_display = ('id', 'title',)
<span style="color: #
inlines = [UserInfoInline, ]
action,列表时,定制action中的操作
1 @admin.register(models.UserInfo)
2 class UserAdmin(admin.ModelAdmin):
# 定制Action行为具体方法
def func(self, request, queryset):
print(self, request, queryset)
print(request.POST.getlist('_selected_action'))
func.short_description = "中文显示自定义Actions"
<span style="color: #
actions = [func, ]
<span style="color: #
<span style="color: #
# Action选项都是在页面上方显示
<span style="color: #
actions_on_top = True
<span style="color: #
# Action选项都是在页面下方显示
<span style="color: #
actions_on_bottom = False
<span style="color: #
<span style="color: #
# 是否显示选择个数
<span style="color: #
actions_selection_counter = True
定制HTML模板
<span style="color: # add_form_template = None
<span style="color: # change_form_template = None
<span style="color: # change_list_template = None
<span style="color: # delete_confirmation_template = None
<span style="color: # delete_selected_confirmation_template = None
<span style="color: # object_history_template = None
raw_id_fields,详细页面,针对FK和M2M字段变成以Input框形式
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
<span style="color: #
raw_id_fields = ('FK字段', 'M2M字段',)
fields,详细页面时,显示字段的字段
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
fields = ('user',)
exclude,详细页面时,排除的字段
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
exclude = ('user',)
readonly_fields,详细页面时,只读字段
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
readonly_fields = ('user',)
fieldsets,详细页面时,使用fieldsets标签对数据进行分割显示
1 @admin.register(models.UserInfo)
2 class UserAdmin(admin.ModelAdmin):
fieldsets = (
('基本数据', {
'fields': ('user', 'pwd', 'ctime',)
('其他', {
'classes': ('collapse', 'wide', 'extrapretty'),
# 'collapse','wide', 'extrapretty'
'fields': ('user', 'pwd'),
<span style="color: #
<span style="color: #
详细页面时,M2M显示时,数据移动选择(方向:上下和左右)
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)
ordering,列表时,数据排序规则
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
ordering = ('-id',)
<span style="color: #
<span style="color: #
def get_ordering(self, request):
<span style="color: #
return ['-id', ]
view_on_site,编辑时,是否在页面上显示view on set
<span style="color: # view_on_site = False
<span style="color: # 或
<span style="color: # def view_on_site(self, obj):
<span style="color: #
return 'https://www.baidu.com'
radio_fields,详细页面时,使用radio显示选项(FK默认使用select)
<span style="color: # radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL
show_full_result_count = True,列表时,模糊搜索后面显示的数据个数样式
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
# show_full_result_count = True # 1 result (12 total)
<span style="color: #
# show_full_result_count = False
# 1 result (Show all)
<span style="color: #
search_fields = ('user',)
formfield_overrides = {},详细页面时,指定现实插件
1 from django.forms import widgets
2 from django.utils.html import format_html
4 class MyTextarea(widgets.Widget):
def __init__(self, attrs=None):
# Use slightly better defaults than HTML's 20x2 box
default_attrs = {'cols': '<span style="color: #', 'rows': '<span style="color: #'}
default_attrs.update(attrs)
<span style="color: #
super(MyTextarea, self).__init__(default_attrs)
<span style="color: #
<span style="color: #
def render(self, name, value, attrs=None):
<span style="color: #
if value is None:
<span style="color: #
value = ''
<span style="color: #
final_attrs = self.build_attrs(attrs, name=name)
<span style="color: #
return format_html('&textarea {}&\r\n{}&/textarea&',final_attrs, value)
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
<span style="color: #
formfield_overrides = {
<span style="color: #
models.models.CharField: {'widget': MyTextarea},
<span style="color: #
prepopulated_fields = {},添加页面,当在某字段填入值后,自动会将值填充到指定字段。
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
<span style="color: #
prepopulated_fields = {"email": ("user","pwd",)}
PS: DjangoAdmin中使用js实现功能,页面email字段的值会在输入:user、pwd时自动填充
form = ModelForm,用于定制用户请求时候表单验证
1 from app01 import models
2 from django.forms import ModelForm
3 from django.forms import fields
6 class MyForm(ModelForm):
others = fields.CharField()
class Meta:
<span style="color: #
model = models = models.UserInfo
<span style="color: #
fields = "__all__"
<span style="color: #
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
<span style="color: #
form = MyForm
empty_value_display = "列数据为空时,显示默认值"
<span style="color: # @admin.register(models.UserInfo)
<span style="color: # class UserAdmin(admin.ModelAdmin):
<span style="color: #
empty_value_display = "列数据为空时,默认显示"
<span style="color: #
<span style="color: #
list_display = ('user','pwd','up')
<span style="color: #
<span style="color: #
def up(self,obj):
<span style="color: #
return obj.user
<span style="color: #
up.empty_value_display = "指定列数据为空时,默认显示"
阅读(...) 评论()

我要回帖

更多关于 django中间件提供了哪些入口 的文章

 

随机推荐