简介Django中内置的一些中间件
认证支持中间件
中间件类:django.contrib.auth.middleware.AuthenticationMiddleware.django.contrib.auth.middleware.AuthenticationMiddleware.
这个中间件激活认证支持功能.它在每个传入的HttpRequest对象中添加代表当前登录用户的request.user属性。Itaddstherequest.userattribute,representingthecurrentlylogged-inuser,toeveryincomingHttpRequestobject.
通用中间件
Middlewareclass:django.middleware.common.CommonMiddleware.
这个中间件为完美主义者提供了一些便利:
禁止``DISALLOWED_USER_AGENTS``列表中所设置的useragent访问:一旦提供,这一列表应当由已编译的正则表达式对象组成,这些对象用于匹配传入的request请求头中的user-agent域。下面这个例子来自某个配置文件片段:
importre DISALLOWED_USER_AGENTS=( re.compile(r'^OmniExplorer_Bot'), re.compile(r'^Googlebot') )
- 请注意importre,因为DISALLOWED_USER_AGENTS要求其值为已编译的正则表达式(也就是re.compile()的返回值)。
- 依据``APPEND_SLASH``和``PREPEND_WWW``的设置执行URL重写:如果APPEND_SLASH为True,那些尾部没有斜杠的URL将被重定向到添加了斜杠的相应URL,除非path的最末组成部分包含点号。因此,foo.com/bar会被重定向到foo.com/bar/,但是foo.com/bar/file.txt将以不变形式通过。
- 如果PREPEND_WWW为True,那些缺少先导www.的URLs将会被重定向到含有先导www.的相应URL上。willberedirectedtothesameURLwithaleadingwww..
- 这两个选项都是为了规范化URL。其后的哲学是每个URL都应且只应当存在于一处。技术上来说,URLexample.com/bar与example.com/bar/及www.example.com/bar/都互不相同。
- 依据``USE_ETAGS``的设置处理Etag:ETags是HTTP级别上按条件缓存页面的优化机制。如果USE_ETAGS为True,Django针对每个请求以MD5算法处理页面内容,从而得到Etag,在此基础上,Django将在适当情形下处理并返回NotModified回应(译注:
- 请注意,还有一个条件化的GET中间件,处理Etags并干得更多,下面马上就会提及。
压缩中间件
中间件类django.middleware.gzip.GZipMiddleware.
这个中间件自动为能处理gzip压缩(包括所有的现代浏览器)的浏览器自动压缩返回]内容。这将极大地减少Web服务器所耗用的带宽。代价是压缩页面需要一些额外的处理时间。
相对于带宽,人们一般更青睐于速度,但是如果你的情形正好相反,尽可启用这个中间件。
条件化的GET中间件
Middlewareclass:django.middleware.http.ConditionalGetMiddleware.
这个中间件对条件化GET操作提供支持。如果response头中包括Last-Modified或ETag域,并且request头中包含If-None-Match或If-Modified-Since域,且两者一致,则该response将被response304(Notmodified)取代。对ETag的支持依赖于USE_ETAGS配置及事先在response头中设置ETag域。稍前所讨论的通用中间件可用于设置response中的ETag域。Asdiscussedabove,theETagheaderissetbytheCommonmiddleware.
此外,它也将删除处理HEADrequest时所生成的response中的任何内容,并在所有request的response头中设置Date和Content-Length域。
反向代理支持(X-Forwarded-For中间件)
Middlewareclass:django.middleware.http.SetRemoteAddrFromForwardedFor.
这是我们在什么是中间件这一节中所举的例子。在request.META['HTTP_X_FORWARDED_FOR']存在的前提下,它根据其值来设置request.META['REMOTE_ADDR']。在站点位于某个反向代理之后的、每个request的REMOTE_ADDR都被指向127.0.0.1的情形下,这一功能将非常有用。Itsetsrequest.META['REMOTE_ADDR']basedonrequest.META['HTTP_X_FORWARDED_FOR'],ifthelatterisset.Thisisusefulifyou'resittingbehindareverseproxythatcauseseachrequest'sREMOTE_ADDRtobesetto127.0.0.1.
红色警告!
这个middleware并不验证HTTP_X_FORWARDED_FOR的合法性。
如果站点并不位于自动设置HTTP_X_FORWARDED_FOR的反向代理之后,请不要使用这个中间件。否则,因为任何人都能够伪造HTTP_X_FORWARDED_FOR值,而REMOTE_ADDR又是依据HTTP_X_FORWARDED_FOR来设置,这就意味着任何人都能够伪造IP地址。
只有当能够绝对信任HTTP_X_FORWARDED_FOR值得时候才能够使用这个中间件。
会话支持中间件
Middlewareclass:django.contrib.sessions.middleware.SessionMiddleware.
这个中间件激活会话支持功能.
Middlewareclasses:django.middleware.cache.UpdateCacheMiddlewareanddjango.middleware.cache.FetchFromCacheMiddleware.
这些中间件互相配合以缓存每个基于Django的页面。
事务处理中间件
Middlewareclass:django.middleware.transaction.TransactionMiddleware.
这个中间件将数据库的COMMIT或ROLLBACK绑定到request/response处理阶段。如果view函数成功执行,则发出COMMIT指令。如果view函数抛出异常,则发出ROLLBACK指令。
这个中间件在栈中的顺序非常重要。其外层的中间件模块运行在Django缺省的保存-提交行为模式下。而其内层中间件(在栈中的其后位置出现)将置于与view函数一致的事务机制的控制下。