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

yizhihongxing

下面就是关于Django中间件工作流程及写法的完整攻略。

什么是Django中间件?

Django中间件是一种类似于拦截器的机制,可以在请求到达视图之前或者到达视图之后对请求或者响应做一些处理。常见的中间件处理方式有下面几种:

  1. 认证:检查请求的用户是否合法,并在需要时向其提供处理超过其权限等身份验证服务。
  2. 缓存:从缓存中返回响应以提高性能。
  3. 压缩: 将响应压缩后发送到客户端以减小传输大小和提高性能。
  4. 安全:提供威胁保护,例如防止跨站点脚本攻击或点击劫持。
  5. 日志:记录请求和响应。
  6. 调整:修改请求和响应。

Django中间件的执行过程

Django中间件的执行过程可以简单概括为以下几步:

  1. 请求到达Middelware的第一个是process_request方法。在process_request方法中你可以返回HttpResponse,如果返回HttpResponse实例,则中间件会跳过其他的中间件并立即返回HttpResponse。如果不返回HttpResponse则继续执行其他的中间件,在所有中间件完成后再返回HttpResponse。
  2. 通过Middelware中的process_view方法,找到该请求要执行的视图函数。
  3. 通过Middelware中的process_exception方法,在抛出异常的情况下执行。
  4. 通过Middelware中的process_template_response方法,在视图函数响应过后,模板响应之前执行。
  5. 最后通过Middelware中的process_response方法,在视图函数和模板响应之后执行。

Django中间件的写法实例代码

下面我们通过简单的示例来看看Django中间件的写法:

示例一:

功能:

  1. 记录用户访问记录并输出到命令行。
# middleware.py
import time
from django.utils.deprecation import MiddlewareMixin

class RecordMiddleware(MiddlewareMixin):
    def process_request(self, request):
        self.start_time = time.time()

    def process_response(self, request, response):
        end_time = time.time()
        cost_time = end_time - self.start_time
        print(f'{request.method} {request.path} {response.status_code} {cost_time}s')
        return response

示例二:

功能:

  1. 判断用户是否登录,若未登录则跳转到登录页面。
# middleware.py
from django.http import HttpResponseRedirect
from django.urls import reverse

class LoginRequiredMiddleware(object):

    def __init__(self, get_response):
        self.get_response = get_response
        self.login_url = reverse('login')

    def __call__(self, request):

        # 如果用户访问的是登录页面,直接跳过中间件检查
        if request.path == self.login_url:
            return self.get_response(request)

        # 如果用户未登录,跳转至登录页面
        if not request.user.is_authenticated:
            return HttpResponseRedirect(self.login_url)

        response = self.get_response(request)
        return response

以上就是Django中间件工作流程及写法实例代码的完整攻略,希望能够帮助到您。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django中间件工作流程及写法实例代码 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 将Python的Django框架与认证系统整合的方法

    将Python的Django框架与认证系统整合的方法是很常见的需求,主要是在网站建设等场景中需要用户注册、登录、注销等功能。下面是将Python的Django框架与认证系统整合的完整攻略。 1.创建Django项目并设置认证系统 首先,我们需要创建一个Django项目,并设置认证系统。可以在终端中执行以下命令来创建Django项目: django-admin…

    Django 2023年5月16日
    00
  • tornado和django的结合使用 tornado Server for django WSGI APP

    #!/usr/bin/env python # Run this with # Serves by default at # http://localhost:8080/hello-tornado and # http://localhost:8080/hello-django from tornado.options import options, def…

    Django 2023年4月11日
    00
  • django 執行數據遷移 報錯:HINT: Add or change a related_name argument to the definition for ‘User.user_permissions’ or ‘User.u

    解決方法: 1.在項目的settings 中,添加 AUTH_USER_MODEL=”users.UserProfile”#app名稱下的UserProfile 類其中 users 表示 你的app;UserProfile 表示你在models下 創建的類然後再執行 makemigrations users migrate users 即可 如圖:  

    Django 2023年4月12日
    00
  • Django 连接Mysql异常处理

    启动manage.py提示 连接数据库异常 django.db.utils.OperationalError: (2003, “Can’t connect to MySQL server on ‘127.0.0.1’ ([Errno 10061] )”)   此时cmd.exe  输入mysql指令同样有异常提示: C:\Windows\system32&g…

    Django 2023年4月11日
    00
  • ubuntu下Django的搭建

    工具:Window下的pycharm 、VirtualBox下的Ubuntu系统、非必需的Xshell(远程连接工具) 现在针对各种包或python版本不能共存或包不能很好下载的问题,开始流行使用虚拟环境来解决这个问题,所有第一步我们要在Ubuntu下新建一个虚拟环境,当然不新建虚拟环境也是可以的。 Linux下输入workon查看已有的虚拟环境,我的已有两…

    Django 2023年4月13日
    00
  • Django权限控制进阶

    一、一级菜单的排序 我们用字典存放菜单信息,而字典是无序的,当一级菜单过多时可能会出现乱序情况,因此需要给一级菜单排序 1.给一级菜单表的model中加一个weight权重的字段 ,权重越大越靠前 weight = models.IntegerField(default=1, verbose_name=’权重’) 2.应用有序字典存放菜单信息 引用: fro…

    Django 2023年4月12日
    00
  • Django 构建模板form表单的两种方法

    下面我将详细讲解Django构建模板form表单的两种方法,并提供两个示例。 方法一:使用Django模板默认的form表单 Django模板默认提供了form表单的渲染,方便我们快速地渲染出一个表单。 使用此方法时,需要在视图函数中定义一个form变量,并为其赋值为一个forms.Form对象(也可以是子类或其他表单类)。然后在模板中,使用form.as_…

    Django 2023年5月16日
    00
  • django-django的六种缓存设置

    参考博客:https://www.cnblogs.com/xiaonq/p/7978402.html#i6 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显 缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作 而是直接从内存或者Redis…

    Django 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部