diango—视图层
1、视图函数的返回值
1.1 方法说明
1、视图函数必须有一个返回值,并且返回值的数据类型必须是HttpResponse对象
2、有四种形式返回HttpResponse,它们都是继承于HttpResponse
- HttpResponse 字符串
- render http页面
- redirect 重定向
- JsonResponse Json字符串
1.2 使用方法
# HttpResponse
return HttpResponse(str)
# render
return render(request,'html文件名',{key:value}) # 第三个参数需要时才用,不需要时不用,key为任意字符串,html页面通过key引用value
# redirect
return redirect(url) # 重定向
# JsonResponse # 以序列化字典为例
return JsonResponse(user_dic,json_dumps_params={'ensure_ascii':False})
'''
1、json_dumps_params使得序列化时不将数据按照ascii转码,保证了中文的正确传输
2、JsonResponse 方法内部也是通过json模块完成序列化
3、JsonResponse 参数safe默认为True,代表只能序列化字典,若想序列化其他数据,需要改为False
'''
2、FBV与CBV
2.1 说明
FBV指的是基于函数的视图,即普通的视图函数,需要对请求方式做判断,再进行响应
CBV指的是基于类的视图,url映射到这个类,类中根据请求定义不同的方法,自动执行对应的请求函数
# views.py
from django.views import View
class MyLogin(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
return HttpResponse('post')
# urls.py
# CBV的路由匹配与FBV不同
url(r'^login/',views.MyLogin.as_view())
2.2 源码分析CBV
文字版:
'''
MyLogin.as_view()
1、调用父类View的classonlymethod方法as_view
2、View类中,定义了http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
3、as_view将函数view闭包
4、在闭包函数view中,自定义实例化一个MyLogin对象
5、闭包函数view的返回值为View类中的对象绑定方法dispatch的调用
6、dispatch方法中,根据request.method.lower(),判断请求方式是否存在于http_method_names中
7、若存在就通过反射获取请求方法的调用(即类MyLogin中的自定义请求方法)
不存在或者找不到该方法就返回类View中的对象绑定方法http_method_not_allowed的调用
(此处需要注意,反射获取方法属性时,对象属性的查找顺序是先对象,再类,再父类)
8、http_method_not_allowed是针对不同的情况返回不同的错误状态码,如405
'''
图解版:
3、CBV的装饰器
即给视图层的类方法添加装饰器
3.1 自定义装饰器
1、不能给类本身添加
2、通过语法糖,给每一个需要用装饰器的方法添加
3.2 django内置模块
代码:
from django.utils.decotators import method_decorator
# 1、推荐使用的方法,直接在要用的方法上添加
class MyLogin(View):
@method_decorator(outter)
def get(self,request):
return render(request,'login.html')
@method_decorator(outtor)
def post(self,request):
return HttpResponse('post')
# 2、不推荐的使用方式,在类上面添加
@method_decorator(outter,name='get') # 可以指定给哪一个方法,也可以不指定,即所有方法都被装饰
class MyLogin(View):
pass
# 3、装饰给dispatch
'''
由源码分析可知,dispatch的返回值就是真正被执行的请求函数的调用
给dispatch装饰就是给当前真正执行的视图函数装饰
'''
class MyLogin(View):
@method_decorator
def dispatch(self,request,*args,**kwargs):
return super().dispatch(request,*args,**kwargs)