FBV视图函数
FBV(function base views) 就是在视图里使用函数处理请求,面向过程式的编程,
CBV视图类
#urls.py路由写法,其中views.login.as_view()中的login值得是处理这个路径相关请求的视图类
url(r'^login/', views.login.as_view()),
from django.views import View
#请求login路径时执行的类
class login(View):
#重构父类View类的dispatch方法可以在处理请求之前和请求完成之后,添加一些处理的逻辑,
#父类View的dispatch方法查看请求的类型,然后通过反射来调用本类中的对应函数,来处理请求
#如果没有找到请求方式对应的函数,就会执行父类中dispatch的第三个参数,也就是报错
def dispatch(self, request, *args, **kwargs):
print(f'{request.method}请求来了')
ret = super().dispatch(request, *args, **kwargs)
print('逻辑处理完成')
return ret
#如果是处理GET请求就直接定义get方法,父类View中的dispatch方法通过反射的方式来获取get函数来处理GET请求
def get(self, request):
print('111')
return render(request, 'login.html')
#如果是处理POST请求就直接定义get方法,父类View中的dispatch方法通过反射的方式来获取POST函数来处理GET请求
def post(self, request):
print('222')
return HttpResponse('登陆成功')
#请求home路径时执行的类
class home(View):
def get(self, request):
return render(request, 'home.html')
def post(self, request):
return HttpResponse('登陆成功')
#视图类的源码流程:
views.Addclass.as_view()
1.程序加载,执行Addclass的类方法as_view
在本类中未找到,由于该类继承了View,因此去父类找找看,发现存在
2.调用父类as_view的类方法(@classonlymethod)-->cls为Addclass
该方法返回重点实现任务:
1.定义了view方法
2.并返回view
请求到来时,执行下面操作
3.结果变成执行view
4.view的执行结果就是views.Addclass.as_view()的执行结果
3.调用View的view方法
1.self = cls(**initkwargs)因此self为Addclass类
2.该函数返回self.dispatch(request, *args, **kwargs)
3.需要先执行dispatch,并把执行结果返回给view函数
4.执行View的dispatch方法
1.获取request.method请求方式
2.通过字符串的方式getattr(Addclass,'get')赋值给handler
3.若不存在则返回报错信息给handler
4.执行handler-->相当于执行get(request,*args,**kwargs)
5.把结果return给view
视图类加装饰器
from django.views import View
#如果要给视图类添加装饰器就要使用method_decorator这个方法
from django.utils.decorators import method_decorator
# 方式一:类装饰器,不常用
@method_decorator(func, name='get') # 给类中的某个方法添加装饰器,只能指向一个方法,
@method_decorator(func, name='post') # 如果要加多个,就再加一个装饰器,指向这个方法,
class login(View):
# 方式二:给dispatch添加装饰器,在请求处理之前和处理之后添加一些逻辑.
@method_decorator(func)
def dispatch(self, request, *args, **kwargs):
print(f'{request.method}请求来了')
ret = super().dispatch(request, *args, **kwargs)
print('逻辑处理完成')
return ret
# 方式三:给执行的请求方式添加一个装饰器,在处理这个请求的时候,添加一些逻辑
@method_decorator(func)
def get(self, request):
print('111')
return render(request, 'login.html')
def post(self, request):
print('222')
return HttpResponse('登陆成功')