`
qzriso
  • 浏览: 236406 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

Django笔记11(中间件)

阅读更多
1.一个例子

class SetRemoteAddrFromForwardedFor(object):
    def process_request(self, request):
        try:
            real_ip = request.META['HTTP_X_FORWARDED_FOR']
        except KeyError:
            pass
        else:
            # HTTP_X_FORWARDED_FOR can be a comma-separated list of IPs.
            # Take just the first one.
            real_ip = real_ip.split(",")[0]
            request.META['REMOTE_ADDR'] = real_ip

一旦安装了该中间件,每个request中的 X-Forwarded-For 值都会被自动插入到 request.META['REMOTE_ADDR'] 中。这样,Django应用就不需要关心自己是否位于负载平衡proxy之后;简单读取 request.META['REMOTE_ADDR'] 的方式在是否有proxy的情形下都将正常工作。

2. 安装中间件
要启用一个中间件,只需将其添加到配置模块的 MIDDLEWARE_CLASSES 元组中。在 MIDDLEWARE_CLASSES 中,中间件组件用字符串表示:指向中间件类名的完整Python路径。下面是 django-admin.py startproject 创建的缺省 MIDDLEWARE_CLASSES :

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.doc.XViewMiddleware'
)

这里中间件出现的顺序非常重要。在request和view的处理阶段,Django按照 MIDDLEWARE_CLASSES 中出现的顺序来应用中间件,而在response和异常处理阶段,Django则按逆序来调用它们。也就是说,Django将 MIDDLEWARE_CLASSES 视为view函数外层的顺序包装子:在request阶段按顺序从上到下穿过,而在response则反过来。

3. 中间件方法
Initializer: __init__(self)
出于性能的考虑,每个已启用的中间件在每个服务器进程中只初始化 一 次。也就是说 __init__() 仅在服务进程启动的时候调用,而在针对单个request处理时并不执行。
对一个middleware而言,定义 __init__() 方法的通常原因是检查自身的必要性。如果 __init__() 抛出异常 django.core.exceptions.MiddlewareNotUsed ,则Django将从middleware栈中移出该middleware。
在中间件中定义 __init__() 方法时,除了标准的 self 参数之外,不应定义任何其它参数。

Request预处理函数: process_request(self, request)
这个方法的调用时机在Django接收到request之后,但仍未解析URL以确定应当运行的view之前。Django向它传入相应的 HttpRequest 对象,以便在方法中修改。
process_request() 应当返回 None 或 HttpResponse 对象.
如果返回 None , Django将继续处理这个request,执行后续的中间件, 然后调用相应的view.
如果返回 HttpResponse 对象, Django 将不再执行 任何 其它的中间件(而无视其种类)以及相应的view。 Django将立即返回该 HttpResponse .

View预处理函数: process_view(self, request, view, args, kwargs)
这个方法的调用时机在Django执行完request预处理函数并确定待执行的view之后,但在view函数实际执行之前。
request HttpRequest 对象 .
view Django将调用的处理request的python函数. 这是实际的函数对象本身, 而不是字符串表述的函数名。
args 将传入view的位置参数列表,但不包括 request 参数(它通常是传入view的第一个参数)
kwargs 将传入view的关键字参数字典.
如同 process_request() , process_view() 应当返回 None 或 HttpResponse 对象。
如果返回 None , Django将继续处理这个 request ,执行后续的中间件, 然后调用相应的view.luxi78@gmail.com
如果返回 HttpResponse 对象, Django 将不再执行 任何 其它的中间件(不论种类)以及相应的view. Django将立即返回

Response后处理函数: process_response(self, request, response)
这个方法的调用时机在Django执行view函数并生成response之后。这里,该处理器就能修改response的内容;一个常见的用途是内容压缩,如gzip所请求的HTML页面。
这个方法的参数相当直观: request 是request对象,而 response 则是从view中返回的response对象。
process_response() 必须 返回 HttpResponse 对象. 这个response对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。

Exception后处理函数: process_exception(self, request, exception)
这个方法只有在request处理过程中出了问题并且view函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件, 或者甚至尝试从错误中自动恢复。
这个函数的参数除了一贯的 request 对象之外,还包括view函数抛出的实际的异常对象 exception 。
process_exception() 应当返回 None 或 HttpResponse 对象.
如果返回 None , Django将用框架内置的异常处理机制继续处理相应request。
如果返回 HttpResponse 对象, Django 将使用该response对象,而短路框架内置的异常处理机制
分享到:
评论

相关推荐

    Django教程笔记之中间件middleware详解

    Django 中的中间件(middleware),是一个镶嵌到Django的request/response处理机制中的一个hooks框架,是一个修改django...这篇文章主要给大家介绍了关于Django教程笔记之中间件middleware的相关资料,需要的朋友可以参考下

    Django中间件基础用法详解

    django的中间件可以在视图函数执行前执行,比如登陆验证、日志记录等,下面简单说明一下中间件的基础用法,主要为笔者学习时的笔记 1. 在django项目文件夹下创建一个用于存放中间件函数的文件夹 文件夹的名字可...

    DjangoPower:Django源码阅读笔记

    Django源码阅读笔记 >一开始是想写几篇博客,但是中间好像要描述过多的代码,于是还是推github吧 :grinning_face_with_smiling_eyes:还是采用先代码+注释的形式,最后再用博客来做总结。 ---------- 03.21更新-----...

    decode-Django:Django原始代码剖析注释版本

    解码Django Decode-Django是Django的源代码分析。 Django原始代码剖析注释版本。... 中间件完成 快捷方式完成 模板 模板标签 测试 实用程序 意见完成 博客总结 我的博客当中记录阅读笔记: 我的博客 联系我

    django号码管理系统,在里面的demoTotal中,web,demo,demoForm是学习的记录笔记

    - 项目文件 &APP &view.py &models.py & urls.py & templates & static - urls 路由系统 ``` # /admin/edit/123 path('admin/edit/<int:aid>', admin.admin_edit), # /admin/edit/?... - 中间件

    django-dynamic-link:https

    Django本身,它从django.contrib及其语言环境中间件重定向。 安装 使用pip安装(推荐) Pip将下载并安装该软件包,并处理所有依赖项。 如果您尚未在系统上使用pip,请先安装setuptools,然后再运行“ easy_install...

    AspNetCore-Learning-Mvc::sun:AspNetCore学习笔记(Mvc篇),学生管理系统

    Asp.Net Core 学习笔记系列博客: C#语言学习系列博客: 相关博文推荐: 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项目文件的AspNetCoreHostingModel属性。 ...

    dealer:做一些员工

    2 内容手动创建后端Django支持设定值上下文处理器中间件烧瓶支持设定值用法金字塔支撑Heroku支持设定值用法错误追踪器贡献贡献者执照 要求python 2.7、3.5+ 笔记对于Django <2,请使用Dealer <2 安装经销商应...

    java中solr的笔试题-note:个人学习信息

    个人学习笔记 python nginx AWS认证考试 技术路线 LB负载均衡 负载均衡常见使用场景,问题定位,特别是对于概率性出现的访问超时问题定位。包含如下组件 nginx lvs openresty kong apigateway 消息中间件 对于消息...

Global site tag (gtag.js) - Google Analytics