(8)django 中间件

多继承和MRO的顺序

Python, C++ 都是多继承。

做一个下单页面,要在登录了以后才能看到。

以前学过,要验证用户登录状态,有一个装饰器,但是,那是在 def 函数 使用的。比如这样:

from django.contrib.auth.decorators import login_required

@login_required
def set_password(request):
    if request.is_ajax():
        back_dic = {'code': 1000, 'msg': ''}
        return JsonResponse(back_dic)

现在,我们要在 类视图 使用。

from django.contrib.auth.mixins import LoginRequiredMixin


class OrderView(LoginRequiredMixin, View):
    def get(self, request):
        return HttpResponse('GET--订单页面,必须登录')

    def post(self, request):
        return HttpResponse('POST--订单页面,必须登录')

分析 源码:

class LoginRequiredMixin(AccessMixin):
    """Verify that the current user is authenticated."""
    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return self.handle_no_permission()
        return super().dispatch(request, *args, **kwargs)

request.user --> 请求用户的信息
is_authenticated --> 判断用户是否登录

  • 当我们在浏览器输入 http://127.0.0.1:8000/order/,
  • 后台会对路由进行引导匹配 path(‘order/’, views.OrderView.as_view())
  • 这时候会调用 as_view() 方法,as_view 会调用 view(源码)方法,view 又调用 dispatch,
    dispatch会进行判断,再进行路由判断。
  • 如果是 class OrderView(View, LoginRequiredMixin), View在前面的话,需要注意
    继承父类的顺序 mro属性

在这里插入图片描述

在 PyCharm 的 Terminal 里写:

python manage.py shell

>>> from book.views import OrderView
>>> OrderView.__mro__
(<class 'book.views.OrderView'>, <class 'django.contrib.auth.mixins.LoginRequiredMix
in'>, <class 'django.contrib.auth.mixins.AccessMixin'>, <class 'django.views.generic
.base.View'>, <class 'object'>)
>>>

中间件

Django 中的中间件是一个轻量级、底层的插件系统,可以介入 Django 的请求和响应处理过程,
修改 Django 的输入或者输出,中间件是一种无侵入式的开发方式。(相当于一个大坝)

Django 在中间件中预置了六个方法:

1、初始化方法

def __init__(self, get_response=None):
	pass

2、处理请求之前

def process_request(self, request):
	pass

3、处理视图之前

def process_view(self, request, view_func, view_args, view_kwargs):
	pass

4、处理模板响应之前

def process_template_response(self, request, response):
	pass

5、处理响应之后

def process_response(self, request, response):
	pass

6、(视图)异常处理

def process_exception(self, request, exception):
	pass

我们要做一个自己的中间件,在哪里写代码都可以的,但是为了解耦合,新建mymiddleware.py

from django.utils.deprecation import MiddlewareMixin


class TestMiddleWare(MiddlewareMixin):

    def process_request(self, request):
        print('每次请求之前都调用执行')

    def process_response(self, request, response):
        print('每次响应前都调用执行')
        return response

然后到 settings.py 里注册中间件

'book.mymiddleware.TestMiddleWare'

中间件能够做什么?

比如在中间件验证用户是否存在,返回注册页面或者登录页面:

class TestMiddleWare(MiddlewareMixin):

    def process_request(self, request):
        print('每次请求之前都调用执行')
	
		username = request.COOKIE.get('name')
		if username is None:
			return redirect('/register/')

中间件执行顺序:

所有中间件里面的 process_request 从上到下执行后
然后 process_response 从下到上 执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值