内置的中间件
Django自带若干内置中间件以处理常见问题,将从下一节开始讨论。
认证支持中间件
中间件类: django.contrib.auth.middleware.AuthenticationMiddleware
. django.contrib.auth.middleware.AuthenticationMiddleware
.
这个中间件激活认证支持功能. 它在每个传入的 HttpRequest
对象中添加代表当前登录用户的 request.user
属性。 It adds the request.user
attribute, representing the currently logged-in user, to every incoming HttpRequest
object.
完整的细节请参见第12章。
通用中间件
Middleware class: django.middleware.common.CommonMiddleware
.
这个中间件为完美主义者提供了一些便利:
禁止DISALLOWED_USER_AGENTS
列表中所设置的user agent访问 :一旦提供,这一列表应当由已编译的正则表达式对象组成,这些对象用于匹配传入的request请求头中的user-agent域。 下面这个例子来自某个配置文件片段:
import re
DISALLOWED_USER_AGENTS = (
re.compile(r'^OmniExplorer_Bot'),
re.compile(r'^Googlebot')
)
请注意import re
,因为DISALLOWEDUSER_AGENTS
要求其值为已编译的正则表达式(也就是re.compile()
的返回值)。依据APPENDSLASH
和PREPEND_WWW
的设置执行URL重写 :如果APPENDSLASH
为True
, 那些尾部没有斜杠的URL将被重定向到添加了斜杠的相应URL,除非path的最末组成部分包含点号。 因此,foo.com/bar
会被重定向到foo.com/bar/
, 但是foo.com/bar/file.txt
将以不变形式通过。如果PREPEND_WWW
为 True , 那些缺少先导www.的URLs将会被重定向到含有先导www.的相应URL上。 will be redirected to the same URL with a leading www..这两个选项都是为了规范化URL。 其后的哲学是每个URL都应且只应当存在于一处。 技术上来说,URLexample.com/bar
与example.com/bar/
及www.example.com/bar/
都互不相同。依据USEETAGS
的设置处理Etag : ETags 是HTTP级别上按条件缓存页面的优化机制。 如果USE_ETAGS
为True
,Django针对每个请求以MD5算法处理页面内容,从而得到Etag, 在此基础上,Django将在适当情形下处理并返回Not Modified
回应(译注:请注意,还有一个条件化的GET
中间件, 处理Etags并干得更多,下面马上就会提及。
压缩中间件
中间件类 django.middleware.gzip.GZipMiddleware
.
这个中间件自动为能处理gzip压缩(包括所有的现代浏览器)的浏览器自动压缩返回]内容。 这将极大地减少Web服务器所耗用的带宽。 代价是压缩页面需要一些额外的处理时间。
相对于带宽,人们一般更青睐于速度,但是如果你的情形正好相反,尽可启用这个中间件。
条件化的GET中间件
Middleware class: django.middleware.http.ConditionalGetMiddleware
.
这个中间件对条件化 GET
操作提供支持。 如果response头中包括 Last-Modified
或 ETag
域,并且request头中包含 If-None-Match
或 If-Modified-Since
域,且两者一致,则该response将被response 304(Not modified)取代。 对 ETag
的支持依赖于 USE_ETAGS
配置及事先在response头中设置 ETag
域。稍前所讨论的通用中间件可用于设置response中的 ETag
域。 As discussed above, the ETag
header is set by the Common middleware.
此外,它也将删除处理 HEAD
request时所生成的response中的任何内容,并在所有request的response头中设置 Date
和 Content-Length
域。
反向代理支持 (X-Forwarded-For中间件)
Middleware class: django.middleware.http.SetRemoteAddrFromForwardedFor
.
这是我们在 什么是中间件 这一节中所举的例子。 在 request.META['HTTP_X_FORWARDED_FOR']
存在的前提下,它根据其值来设置 request.META['REMOTE_ADDR']
。在站点位于某个反向代理之后的、每个request的 REMOTE_ADDR
都被指向 127.0.0.1
的情形下,这一功能将非常有用。 It sets request.META['REMOTE_ADDR']
based on request.META['HTTP_X_FORWARDED_FOR']
, if the latter is set. This is useful if you’re sitting behind a reverse proxy that causes each request’s REMOTE_ADDR
to be set to 127.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
值得时候才能够使用这个中间件。
会话支持中间件
Middleware class: django.contrib.sessions.middleware.SessionMiddleware
.
这个中间件激活会话支持功能. 细节请参见第12章。 See Chapter 14 for details.
站点缓存中间件
Middleware classes: django.middleware.cache.UpdateCacheMiddleware
and django.middleware.cache.FetchFromCacheMiddleware
.
这些中间件互相配合以缓存每个基于Django的页面。 已在第13章中详细讨论。
事务处理中间件
Middleware class: django.middleware.transaction.TransactionMiddleware
.
这个中间件将数据库的 COMMIT
或 ROLLBACK
绑定到request/response处理阶段。 如果view函数成功执行,则发出 COMMIT
指令。 如果view函数抛出异常,则发出 ROLLBACK
指令。
这个中间件在栈中的顺序非常重要。 其外层的中间件模块运行在Django缺省的 保存-提交 行为模式下。 而其内层中间件(在栈中的其后位置出现)将置于与view函数一致的事务机制的控制下。
关于数据库事务处理的更多信息,请参见附录C。