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

2022-09-19  本文已影响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
中间件调用顺序
上一篇下一篇

猜你喜欢

热点阅读