美文网首页
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顺序

    使用面向对象多继承的特性:子应用中book/views.py 本章需要关注继承顺序,如果class OrderVi...

  • __mro__,调用父类用super()

    在类继承比较复杂的时候,调用mro方法可以查询继承顺序

  • Python高级语法3:方法解析顺序表MRO

    一、多继承以及MRO顺序 1.1、单独调用父类的方法: 父类名.__init__(self, 参数):不建议使用,...

  • 面向对象-super()

    单继承/多继承中的super工作方式方法解析顺序MRO

  • super方法做了什么?

    super方法,可以执行父类中的方法在子类继承多类的情况下,遵循mro算法,顺序关系见执行结果

  • 三、Mixin扩展类 多继承

    1. 多继承 首先要清楚: __mro__ 即 继承顺序 1.1 单继承实现: 1.2 多继承实现: 程序 从 ...

  • 多继承以及MRO顺序

    使用父类名称.方法的方式调用父类方法,会导致父类的父类方法被多次调用 如果使用super().方法的方式,,,,类...

  • 多继承以及MRO顺序

    1. 单独调用父类的方法 运行结果: 2. 多继承中super调用有所父类的被重写的方法 运行结果: 注意: 以上...

  • 多继承以及MRO顺序

    1、单独调用父类的方法 2、多继承中super调用所有父类的被重写方法 3、单继承中super() 总结 supe...

  • 继承

    多继承可以用mro方法来显示方法的查找顺序 多继承顺序查找方法:继承的有向图依次查找入度为0的节点并且删除 接口继...

网友评论

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

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