当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 中间件

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:28

g.args将传入view的位置参数列表,但不包括request 参数(它通常是传 入view的第一个参数)kwargs将传入view的关键字参数字典.Just like process_request() , process_view() should return either None or an HttpResponse object.If it returns None , Django will continue processing this request, executing any other middleware and then the appropriate view.If it returns an HttpResponse object, Django won’t bother calling any other middleware (of any type) or the appropriate view. Django will immediately return that HttpResponse .Response后处理函数: process_response(self, request, response) process_response(self, request, response)这个方法的调用时机在Django执行view函数并生成response之后。 Here, the processor can modify the content of a response. One obvious use case is content compression, such as gzipping of the request’s HTML.这个方法的参数相当直观: request 是request对象,而 response 则是从view中返回的response对象。 requestis the request object, and response is the response object returned from the view.不同可能返回 None 的request和view预处理函数, process_response() 必须 返回 HttpResponse 对象. 这个response对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。 That response could be the original one passed into the function (possibly modified) or a brand-new one.Exception后处理函数: process_exception(self, request, exception) process_exception(self, request, exception)这个方法只有在request处理过程中出了问题并且view函数抛出了一个未捕获的异常时才会被调用。 这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件, 或者甚至尝试从错误中自动恢复。这个函数的参数除了一贯的 request 对象之外,还包括view函数抛出的实际的异常对象 exception 。process_exception() 应当返回 None 或 HttpResponse 对象.如果返回 None , Django将用框架内置的异常处理机制继续处理相应request。如果返回 HttpResponse 对象, Django 将使用该response对象,而短路框架内置的异常处理机制。备注Django自带了相当数量的中间件类(将在随后章节介绍),它们都是相当好的范例。 阅读这些代码将使你对中间件的强大有一个很好的认识。在Djangos wiki上也可以找到大量的社区贡献的中间件范例:http://code.djangoproject.com/wiki/ContributedMiddlewarehttp://code.djangoproject.com/wiki/ContributedMiddleware内置的中间件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 incomingHttpRequest object.完整的细节请参见第12章。通用中间件Middleware class: django.middleware.common.CommonMiddleware .这个中间件为完美主义者提供了一些便利:_禁止 DISALLOWED_USER_AGENTS 列表中所设置的user agent访问_ :一旦提供,这一列表应当由已编译的正则表达式对象组成,这些对象用于匹配传入的request请求头中的user-agent域。 下面这个例子来自某个配置文件片段:import reDISALLOWED_USER_AGENTS = ( re.compile(r'^OmniExplorer_Bot'), re.compile(r'^Googlebot'))请注意 import re ,因为 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上。 will be redirected to the same URL with a leading www..这两个选项都是为了规范化URL。 其后的哲学是每个URL都应且只应当存在于一处。 技术上来说,URLexample.com/bar 与 example.com/bar/ 及 www.example.com/bar/ 都互不相同。_依据 USE_ETAGS 的设置处理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'] 存在的前提下,它根据其值来设置 reque

上一页  [1] [2] [3]  下一页


Django 中间件