Django视图层——中间件概述

参考文献:

https://docs.djangoproject.com/zh-hans/2.0/topics/http/middleware/

中间件定义

中间件是一种嵌入django的request和response请求处理的hooks框架。它是一种轻量级的改变Django全局输入或输出的插件。

每个中间件都有一个特定的功能。比如,Django包含一个AuthenticationMiddleware中间件,可以通过sessions将用户和请求关联。

写自定制的中间件

中间件是可以调用的,它可以调用get_response函数,然后在返回一个中间件。中间件处理一个request请求,然后返回一个response请求,就像view函数一样。如下:

def simple_middleware(get_response):
    # One-time configuration and initialization.

    def middleware(request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

    return middleware

也可以写成类的形式,如下:

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

__init__(get_response)

中间件工厂必须接收get_response参数。也可以初始化一些全局的参数。需要记住以下两点:

  •   Django只使用get_response参数来初始化中间件,所以不能再__init__()方法中定义任何其他参数。
  •   __call__()方法在每次有request请求的时候都会被调用,而__init__()方法只会调用一次,只有当Web服务开始的时候。

标记中间件未被使用

有时候在启动时决定是否使用中间件是很有用的,在上述情况下,你的中间件的__init__()方法可能会引发MiddlewareNotUsed异常。Django会从中间件进程中移除这个中间件,并且打印一条debug消息的log到django.request的logger中,当DEBUG=True

激活中间件

将中间件添加到MIDDLEWARE列表来激活。

在MIDDLEWARE中,每一个中间件都由一个字符串代表,到中间件的python路径或者是函数名。下面是django-admin startproject创建的默认值,如下:

MIDDLEWARE = [
    ‘django.middleware.security.SecurityMiddleware‘,
    ‘django.contrib.sessions.middleware.SessionMiddleware‘,
    ‘django.middleware.common.CommonMiddleware‘,
    ‘django.middleware.csrf.CsrfViewMiddleware‘,
    ‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
    ‘django.contrib.messages.middleware.MessageMiddleware‘,
    ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
]

Django中可以不需要任何的中间件,也就是MIDDLEWARE可以为空。但强烈建议至少使用CommonMiddleware。

MIDDLEWARE中的中间件的顺序是有关系的,因为中间件可以依赖于其他的中间件。比如 , AuthenticationMiddleware在session中保存已验证的用户,它必须在SessionMiddleware中间件运行后再运行。

中间件顺序与层级

在请求流中,在调用view函数之前,Django会根据在MIDDLEWARE列表中定义的从上往下的顺序来依次应用中间件。

你可以把它想象成一个洋葱:每一个中间件的类都是一层,套在了处在核心的view函数的外围。如果这个请求通过了洋葱的所有层(每一层都会调用get_response来将request传递给下一层),最终到达处于核心处的view函数,然后这个response将会从原路返回每一层(按照原先的逆序的方式)。

如果其中有一层短路了,并且返回了一个不带get_response调用的response,那么接下来的层,包括view都看不到request或者response。这个response请求只会从当前层原路返回。

其他的中间件钩子

除了基本的request/response中间件,你也可以添加另外三种特殊的方法给基于类的中间件:

process_view()

process_view(request, view_func, view_args, view_kwargs)

request 是一个HttpRequest对象。view_func是Django中使用的python函数(是一个实际的函数对象,并不是一个函数名)。view_args是一个位置参数列表,会传递给view函数,view_kwargs是一个字典形式的关键字参数,也会传递给view函数。

view_args和view_kwargs都不包括request参数。

Django在调用view函数之前,process_view()方法会被调用。他会返回None或者HttpResponse对象。如果他返回了None,那么Django会加速这个请求,执行除process_view()以外的中间件,然后执行view函数。如果返回HttpResponse对象,

Django将会不调用view函数,它会将response中间件应用到HttpResponse上,然后返回结果。

注意:在视图运行之前或在process_view()中访问中间件中的request.POST将阻止在中间件之后运行的任何视图能够修改请求的上载处理程序,通常应该避免这种情况的发生。

但这个CsrfViewMiddleware类是个例外,因为它提供了csrf_exempt()以及csrf_protect()装饰器,将允许views明确的控制CSRF应该有效的点。

原文地址:https://www.cnblogs.com/aric-zhu/p/9368638.html

时间: 2024-08-06 22:39:12

Django视图层——中间件概述的相关文章

肆拾陆 ---django视图层与模板层

django视图层与模板层 一.视图层 1.1 HttpResponse.render.redirect ? HttpResponse:返回字符串: ? redirect:重定向 ? render:返回一个html页面,也可以给模板传值 ? render的逻辑原理: from django.template import Template,Context def index(request): res = Template('<h1>{{ user }} </h1>') con =

Python之路【第二十八篇】:django视图层、模块层

1.视图函数 文件在view_demo 一个视图函数简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以.无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你的Python目录下面.除此之外没有更多的要求了——可以说“没有什么神奇的地方”.为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中. 视图

Django - - - -视图层之视图函数(views)

阅读目录(Content) 视图层之视图函数(views) 一个简单的视图 1.HttpRequest 2.HttpResponse 1.render 函数 2.redirect 函数 对比render与redirect: 回到顶部(go to top) 视图层之视图函数(views) 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以.

django视图层与模板层

视图层 1.小白必会三板斧 1.HttpResponse # 返回字符串 2.render # 返回一个html页面 还可以给模板传递 from django.template import Template,Context def index(request): res = Template("<h1> {{ user }} </h1>") con = Context({'user':{'username':'jason','pwd':'123'}}) ret

Django视图层、模板层

过滤器方法 upper 大写方式输出 add 给value加上一个数值 capfirst 第一个字母大写 center 输出指定长度的字符串,把变量居中 cut 删除指定字符串 date 格式化日期 default 如果值不存在,则使用默认值代替 length 返回列表中元素的个数或字符串长度 length_is 检查列表,字符串长度是否符合指定值 标签的方法 for标签 {% for 临时遍历 in 序列%}....{%endfor%} forloop.counter 当前循环的索引值(从1开

【Django】 视图层说明

[Django视图层] 视图层的主要工作是衔接HTTP请求,Python程序和HTML模板,使他们能够有机互相合作从模型层lou到数据并且反馈.说到视图层的工作就有以下几个方面要说 ■ URL映射 对于一般的,通过django.conf.urls.url设置url路径,并且关联视图函数,甚至把url方法的参数写成正则表达式从而可以给视图函数传递多个参数的事情就不多说了.比如: url(r'^single/([0-9]{4})/([0-9]{2})/([0-9]+)/$',views.single

django 之 视图层、模板层

目录 视图层 模板层 视图层 一.视图函数返回的都是一个HttpResponse对象 render 和 redirect 都是直接或者间接传的 二.JsonResponse 下面这个是正常的json的序列化 views.py 层 def test1(request): user_dict={'username':'jason 顶天立地 ','password':123} json_str= json.dumps(user_dict,ensure_ascii= False)###保证中文不会转成b

Django之视图层的简介与使用

Django的View(视图) 一个视图函数(可以是类),简称视图,是一个简单的Python 函数(可以是类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项目目录下面.除此之外没有更多的要求了--可以说"没有什么神奇的地方".为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为

Django(视图层、模板层)

render原理: def ab_render(request): temp = Template("<h1>{{ user_dict }}{{ user_dict.username }}{{ user_dict.password }}</h1>") user_dict = Context({'user_dict':{'username':'jason','password':123}}) res = temp.render(user_dict) return