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()
方法。
所以使用的时候同时继承LoginRequiredMixin
和View
# 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