Django2.1.3 中间件使用详解

环境

  • Win10
  • Python3.6.6
  • Django2.1.3

中间件作用 中间件用于全局修改Django的输入或输出。

中间件常见用途

  • 缓存
  • 会话认证
  • 日志记录
  • 异常

中间件执行流程

全局异常捕捉实现

创建django项目&添加app

django-admin startproject middleware
cd middleware
django-admin startapp app

添加app到项目

# middleware/settings.py
# INSTALLED_APPS最后添加 app
INSTALLED_APPS = [
 'app',
]

编辑中间件并添加到项目

注:中间件注册访问有一定的关联性,位置不可以随意放

# 创建app/middleware.py并编辑
from django.http import JsonResponse

class CustomMiddleware:
 def __init__(self, get_response):
  print("程序启动时执行, 只执行一次")
  self.get_response = get_response

 def __call__(self, request):
  print("中间件开始")
  response = self.get_response(request)
  print("中间件结束")
  return response

 def process_view(self, request, view_func, view_args, view_kwargs):
  print("请求实际函数前执行")

 def process_exception(self, request, exception):
  print("程序异常时执行")
  return JsonResponse({"msg": exception.args[0], "code": -1})

编辑middleware.setttings.py

MIDDLEWARE = [
...
'app.middleware.CustomMiddleware'
]

编写一个异常

# app/views.py
from django.http import JsonResponse

def json_response(request):
 print('json_response')
 err = 3 / 0
 return JsonResponse({"msg": "ok", "code": 0})

添加到路由

# middleware/urls.py

from app.views import json_response, view_response

urlpatterns = [
 ...
 path("view", view_response)
]

运行测试

访问: http://127.0.0.1:8000/json/

结果

另一个觉用途日志记录

# 在中间件函数process_view中添加
print("path: {}; method: {}; data: {}".format(request.get_full_path(), request.method, request.body or ''))

参考: https://docs.djangoproject.com/zh-hans/2.1/topics/http/middleware/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python Django中间件,中间件函数,全局异常处理操作示例

    本文实例讲述了Python Django中间件,中间件函数,全局异常处理操作.分享给大家供大家参考,具体如下: 应用名/middleware.py(定义中间件类,中间件函数.文件名可以任意): from django.http import HttpResponse # 定义中间件类. (类名可以任意,但类中的方法名是固定的) class TestMiddleware(object): '''中间件类''' def __init__(self): '''服务器重启之后,接收第一个请求时调用(只会

  • Django中间件工作流程及写法实例代码

    熟悉web开发的同学对hook钩子肯定不陌生,通过钩子可以方便的实现一些触发和回调,并且做一些过滤和拦截. django中的中间件(middleware)就是类似钩子的一种存在.下面我们来介绍一下,并且给出一些实例. 1.Middleware的工作流程 我盗了一个图,看网上很多人用这个图,来源已经追不明白了.简单声明一下,这个图不是我的.看着图我们分析一下: 1)django的请求相应流程:HttpRequest -> RequestMiddleware -> view function -&

  • Django中间件拦截未登录url实例详解

    1.利用装饰器在视图中拦截未登录的url @login_required(login_url='/user/login/') def homepage(request): pass 这种方法适合于程序中只有少数几个需要登录拦截的url. 2. 利用中间件技术拦截未登录的url 2.1 在settings.py添加MIDDLEWARE设置:middleware.LoginCheckMiddleware MIDDLEWARE = [ 'django.middleware.security.Secur

  • 简介Django中内置的一些中间件

    认证支持中间件 中间件类: django.contrib.auth.middleware.AuthenticationMiddleware . django.contrib.auth.middleware.AuthenticationMiddleware . 这个中间件激活认证支持功能. 它在每个传入的 HttpRequest 对象中添加代表当前登录用户的 request.user 属性. It adds the request.user attribute, representing the

  • 从django的中间件直接返回请求的方法

    实例如下所示: #coding=utf-8 import json import gevent from django.http import HttpResponse from sdsom.web.recorder import get_event_type from sdsom.web.recorder import get_request_event_info from sdsom.db.rpcclient import get_db_client class RecordEventMid

  • 详解Django中间件执行顺序

    中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性. 我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预. 1 中间件的定义方法 定义一个中间件工厂函数,然后返回一个可以别调用的中间件. 中间件工厂函数需要接收一个可以调用的get_response对象. 返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收

  • 详解Django中间件的5种自定义方法

    Django中间件 在http请求 到达视图函数之前 和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 中间件的执行流程 1.执行完所有的request方法 到达视图函数. 2.执行中间件的其他方法 3.经过所有response方法 返回客户端. 注意:如果在其中1个中间件里 request方法里 return了值,就会执行当前中间件的response方法,返回给用户 然后 报错..不会再执行下一个中间件. 自定义中间件 1.在project下随便创建

  • Django 限制用户访问频率的中间件的实现

    一.定义限制访问频率的中间件 common/middleware.py import time from django.utils.deprecation import MiddlewareMixin MAX_REQUEST_PER_SECOND=2 #每秒访问次数 class RequestBlockingMiddleware(MiddlewareMixin): def process_request(self,request): now=time.time() request_queue =

  • 详解django自定义中间件处理

    中间件是一个钩子框架,它们可以介入 Django 的请求和响应处理过程. 它是一个轻量级.底层的 插件 系统,用于在 全局修改 Django 的输入或输出 . 每个中间件组件负责完成某个特定的功能 这里介绍的中间件方法适用于 Django1.10 以上 相关文件: django middleware Django基础中间件 django.utils.deprecation.py class MiddlewareMixin(object): def __init__(self, get_respo

  • Django中间件实现拦截器的方法

    1.前言 JavaWeb Struts2的拦截器我们都能很熟悉,在请求交给Action处理之前,先在拦截器中处理,处理完之后再交给Action. 在Django中如何实现相同的效果? 2.Django中间件 这个是我的项目的目录结构. 首先,先在app目录(也就是我项目的web目录)中新建一个文件命名为middleware.py 里面加入以下代码: try: from django.utils.deprecation import MiddlewareMixin # Django 1.10.x

随机推荐