`
qzriso
  • 浏览: 243002 次
  • 性别: 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笔记 django笔记

    本笔记将深入探讨Django的基础概念、核心功能以及实际应用。 1. **Django简介**: Django是由两位美国开发者在2005年创建的开源项目,它遵循MVC(模型-视图-控制器)设计模式,但更倾向于MTV(模型-模板-视图)...

    2019版-千锋Django-源码+笔记.zip

    千锋Django笔记可能涵盖了从安装配置到项目实战的全过程,包括模型定义、视图处理、模板渲染、表单处理、用户认证与授权等重要知识点。思维导图则以可视化的方式,帮助记忆和理解Django的架构和各组件之间的关系,使...

    千锋Django笔记.rar

    【千锋Django笔记】是针对Python Web开发框架Django的一份详细学习资料,这份笔记可能包含了从基础知识到高级特性的全面讲解。Django是一个高效、成熟且功能强大的开源Web框架,它遵循“DRY(Don't Repeat Yourself...

    千锋教育Django笔记

    【千锋教育Django笔记】是一份专门为初学者设计的学习资料,它涵盖了Django框架的基础知识和实战技巧。Django是Python编程语言中一个强大的、免费的开源Web应用框架,它遵循模型-模板-视图(MTV)架构模式,旨在简化...

    Django学习笔记.zip

    这个名为"Django学习笔记.zip"的压缩包文件显然包含了关于Django框架深入学习的各种资料,涵盖了从基础到进阶的主题。让我们逐一探讨这些主题。 1. **Django安装**:Django的安装通常通过Python的包管理器pip完成。...

    django学习笔记

    11. **Django REST Framework** 对于API开发,Django REST Framework是一个强大且灵活的工具,它简化了JSON接口的构建,包括序列化、权限控制、分页和过滤。 12. **Django Admin** Django自带的管理后台(Admin)...

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

    Django的中间件(Middleware)是其框架内一个至关重要的组成部分,它提供了一种机制,允许开发者在请求被处理之前或之后对请求和响应进行干预。这种全局的处理方式使得中间件成为实现某些核心功能,如认证、会话管理...

    Django学习笔记.pdf

    5. 中间件:中间件是一些可以插拔的框架扩展,它可以在请求和响应过程中插入额外的操作,例如用户认证、权限检查、缓存等。 6. 静态文件管理:Django提供了静态文件的管理功能,包括静态文件的收集、压缩等,使得...

    django框架学习笔记

    8. **中间件(Middleware)**:中间件是Django中的特殊组件,可以全局改变请求和响应处理流程。 9. **认证与授权**:Django提供内置的用户认证系统,包括注册、登录、权限管理等功能。 10. **静态文件与媒体文件**...

    Django学习笔记月伴之夜.

    本"月伴之夜"的学习笔记将深入探讨Django的核心概念和实践应用,通过提供的代码示例来帮助理解其工作原理。 1. **Django简介**: Django遵循模型-模板-视图(Model-Template-View,MTV)的设计模式,提供了一个...

    Django课件笔记详解

    - **全局处理**: 中间件是插入Django请求-响应流程的自定义代码,可以全局影响每个请求。 - **常见用途**: 日志记录、访问控制、性能监控等。 ### 9. 静态文件与媒体文件 - **静态文件**: CSS、JavaScript、图片...

    python+django学习笔记

    这可能包括了对Python高级特性的探讨,如装饰器、生成器、上下文管理器,以及Django中的复杂应用场景,如自定义管理命令、中间件、信号处理器、异步视图等。通过阅读这些笔记,你可以深入理解Python和Django的高级...

    学习Django的笔记和代码

    此外,Django还提供了URL路由系统、表单处理、认证和授权机制、中间件、管理后台等强大功能。通过URLconf,你可以将URL映射到特定的视图函数。表单处理简化了数据验证和用户输入处理。Django的内置认证系统则方便了...

    django学习笔记,共15章+sql操作命令

    **Django学习笔记** Django,作为Python编程语言中的一个强大Web框架,是开发者们构建高效、可扩展网站的首选工具。这篇学习笔记涵盖了从基础到高级的Django知识,旨在帮助初学者快速掌握这个框架,并提升有经验的...

    Django入门笔记.doc

    Django入门笔记主要涵盖以下几个关键知识点: 1. **创建项目**:Django是Python的一款Web框架,用于快速开发高效、可维护的网站。创建项目是使用Django的第一步,通过命令行工具`django-admin startproject project...

    基于Django实现云笔记项目.zip

    在云笔记项目中,可能需要用户登录才能创建和编辑笔记,这涉及到Django的`User`模型和相关的认证中间件。 8. 表单处理: Django的表单系统允许开发者方便地创建和处理HTML表单。在`forms.py`中,可以定义与笔记...

    python基于django的学习笔记系统源码.zip

    - `settings.py`:配置文件,包含了Django项目的各种设置,如数据库连接、中间件、应用列表等。 - `urls.py`:定义项目的URL路由,将URL映射到相应的视图函数。 - `wsgi.py`:Web服务器网关接口,用于部署项目到...

    Python Django Web 点餐项目课件、源代码、课堂笔记

    本项目包含一系列围绕Django点餐系统的课件、源代码和课堂笔记,旨在帮助学习者深入理解Django框架以及如何应用于实际项目开发。 1. **Django框架基础** Django遵循MTV(Model-Template-View)设计模式,其中: -...

Global site tag (gtag.js) - Google Analytics