CBV(class base views) ---- 视图里使用类来处理请求
from django.views import View
# 导入一个django中自带的模块View
class LoginViews(View):
# 重构了父类的dispatch方法,作用是可以在执行get或者post请求之前做一些逻辑判断
def dispatch(self, request, *args, **kwargs):
#调用父类的dispatch方法进行操作,不用写self,因为在使用super方法的时候默认就已经将类名传入了
ret = super().dispatch(request, *args, **kwargs)
return ret # 接收到父类dispatch的返回值返回给重构后的dispatch这个方法
# 在View类中有一个dispatch方法,这个方法用到了反射,会在你的类中找get方法,
def get(self,request):
return render(request,'login.html')
# 在View类中有一个dispatch方法,这个方法用到了反射,会在你的类中找post方法,
def post(self,request):
print(request.POST)
# 同样可以接收到post请求的数据<QueryDict: {'name': ['adrian'], 'pwd': ['123456']}>
return HttpResponse('登陆成功')
urls.py文件
# 路有文件的写法
url(r'^login/',views.LoginViews.as_view())
控制器去视图中找LoginViews类,这个类都做了一些什么事?
views.LoginViews.as_view()
1.程序加载,执行LoginViews的类方法as_view
在本类中未找到,由于该类继承了View,因此去父类找找看,发现存在
2.调用父类as_view的类方法(@classonlymethod)-->cls为LoginViews
该方法返回重点实现任务:
1.定义了view方法
2.并返回view
请求到来时,执行下面操作
3.结果变成执行view
4.view的执行结果就是views.LoginViews.as_view()的执行结果
3.调用View的view方法
1.self = cls(**initkwargs)因此self为LoginViews类
2.该函数返回self.dispatch(request, *args, **kwargs)
3.需要先执行dispatch,并把执行结果返回给view函数
4.执行View的dispatch方法
1.获取request.method请求方式
2.通过字符串的方式getattr(LoginViews,'get')赋值给handler
3.若不存在则返回报错信息给handler
4.执行handler-->相当于执行get(request,*args,**kwargs)
5.把结果return给view
添加装饰器
FBV( function base views) --- 视图里使用函数来处理请求
def index(request):
return render(request,'login.html')
给视图加装饰器
# 下面是装饰器
def wrapper(func):
def inner(*args,**kwargs):
print('执行装饰器前')
ret = func(*args,**kwargs)
print('执行装饰器后')
return ret
return inner
# 在函数上的应用,直接在函数的头部加上@+装饰器的名字
@wrapper
def index(request):
return HttpResponse('这是一个数据')
# 在类中的应用
# 首先需要导入一个模块 : 这个模块是django自己带的,方便在类中加装饰器
from django.utils.decorators import method_decorator
from django.views import View
from django.utils.decorators import method_decorator
#加装饰器的方法三
@method_decorator(wrapper,name='get')
@method_decorator(wrapper,name='post')
class LoginViews(View):
# @method_decorator(wrapper) # 加装饰器的方法二
def dispatch(self, request, *args, **kwargs):
print('这是一个dispatch方法')
ret = super().dispatch(request, *args, **kwargs)
return ret
# @method_decorator(wrapper) # 加装饰器的方法方法一
def get(self,request):
print('这是get方法')
return render(request,'login.html')
def post(self,request):
print('这是post方法')
print(request.POST) # <QueryDict: {'name': ['adrian'], 'pwd': ['123456']}>
return HttpResponse('登陆成功')
下面是将装饰器写在类中的方法头部
下面是将装饰器写在自己类中定义的dispatch方中的执行效果