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
'''

图解版:
View的对象绑定方法as_view及其闭包函数view

类View

类View的对象绑定方法dispatch

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)
posted @ 2019-11-26 19:14  W文敏W  阅读(264)  评论(0编辑  收藏  举报