django类视图MRO

1.类视图定义:

1、继承自 View  (from django.views import View)
2、不同的请求方式 有不同的业务逻辑
    --类视图的方法,就直接采用 http的请求方式的名字作为函数名.例如: get ,post,put,delete...,以此类执行对应的方法。
3、类视图方法的第二个参数 必须是请求实例对象 ,即 request。 返回值为HttpResponse及其子类。    

代码示例:

# book/views.py
from django.views import View
class CenterView(View):
    def get(self, request):
        return HttpResponse('个人中心展示')
    def post(self, request):
        return HttpResponse('个人中心修改') 

思考:如何确定执行get还是post请求。 最终 dispatch()方法里执行了 request.method.lower() in self.http_method_names,得到了对应方法。

类视图 url 定义:

# book/urls.py
from book.views import Centerview
urlpatterns= [
url(r'^center/$', CenterView.as_view()) # as_view()返回一个视图函数名。满足url(正则表达式,函数名)的规则。
]

CenterView.as_view()最终调用的是dispatch()方法。

2.用户中心添加登录验证

此时,需要继承LoginRequiredMixin

class LoginRequiredMixin(AccessMixin):
  def dispatch(self,request,*args,**kwargs):
      if not request.user.is_authenticated:
          returen self.handle_no_permission()
      return super(LoginRequiredMixin,self).dispatch(request,*args,**kwargs)

但是LoginRequiredMixin类没有as_view()方法。
所以使用的时候同时继承LoginRequiredMixinView

# book/views.py
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin
class CenterView(LoginRequiredMixin,View):
    def get(self, request):
        return HttpResponse('个人中心展示')
    def post(self, request):
        return HttpResponse('个人中心修改') 

3. MRO继承顺序


此时的继承顺序为: LoginRequiredMixin,View, Object。
因此,先调用LoginRequiredMixin类的dispatch,然后调用View类的dispatch,并不会调用 LoginRequiredMixin 其父类的 dispatch

posted @ 2021-02-19 00:36  木叶流云  阅读(65)  评论(0编辑  收藏  举报