美文网首页
Django-类视图的多继承重写dispatch和MRO顺序

Django-类视图的多继承重写dispatch和MRO顺序

作者: 测试探索 | 来源:发表于2022-09-19 11:16 被阅读0次

    使用面向对象多继承的特性:
    子应用中book/views.py

    from django.shortcuts import render
    from django.http import HttpResponse,JsonResponse
    from book.models import BookInfo
    import json,re
    
    # Create your views here.
    
    
    ###############类视图######################
    def login(request):
        print(request.method)
    
        if request.method == 'GET':
            return HttpResponse('get 逻辑')
        else:
            return HttpResponse("post 逻辑")
    """
    类视图的定义
    class 类视图名字(View)
        def get(self,request):
            return HttpResponse("xxx")
            
        def http_method_lower(self,request):
            return HttpResponse("xxx")
    1、继承自View
    2、类视图中的方法,是采用 http方法小写来区分不同的请求方式
    """
    from django.views import View
    class LoginView(View):
        def get(self,request):
            return HttpResponse('get get get')
    
        def post(self,request):
            return HttpResponse('post post post')
    
    #################################################
    """
    我的订单-个人中心页面
    如果登录用户 可以访问
    如果未登录用户 不应该访问,应该跳转到登录页面
    
    定义一个订单、个人中心 类视图
    如何定义有没有登录呢?我们以登录后台站点为例
    """
    from django.contrib.auth.mixins import LoginRequiredMixin
    
    #LoginRequiredMixin作用:判断只有登录用户才可以访问页面
    class OrderView(LoginRequiredMixin,View):
        def get(self,request):
            # isLogin = False
            # if not isLogin:
            #     return HttpResponse('没有登录,跳转到整理页面中~~~~~')
            return HttpResponse('GET 我的订单页面,这页面必须登录')
    
        def post(self,request):
            return HttpResponse('POST 我的订单页面,这个页面必须登录')
    
    """
    多继承
    """
    
    image.png
    image.png

    本章需要关注继承顺序,如果class OrderView(View,LoginRequiredMinxin),从源码看,会先走View父类的dispatch方法,而无法走到LoginRequiredMinxin的dispatch方法,导致即使未登录,也可以正常访问,但是cookies里无sessionid 的key


    image.png
    class OrderView(LoginRequiredMinxin,View),从源码看,会先走LoginRequiredMinxin类的dispatch方法,进行登录验证,验证成功才可访问网页,验证不成功,不可访问网页
    image.png

    在127.0.0.1:8000/admin登录成功后,再次访问127.0.0.1:8000/order即可访问成功


    image.png
    image.png
    中间件调用顺序

    相关文章

      网友评论

          本文标题:Django-类视图的多继承重写dispatch和MRO顺序

          本文链接:https://www.haomeiwen.com/subject/eaauortx.html