一、CBV和FBV
1、初识CBV和FBV
我们之前写过的都是基于函数的view,就叫FBV。还可以把view写成基于类的。
就拿我们之前写过的添加班级为例:
# FBV版添加班级 def add_class(request): if request.method == "POST": class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/") return render(request, "add_class.html") # CBV版添加班级 from django.views import View class AddClass(View): def get(self, request): return render(request, "add_class.html") def post(self, request): class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/") #注意:使用CBV时,urls.py中也做对应的修改: # urls.py中 url(r'^add_class/$', views.AddClass.as_view()),
2、给视图加装饰器
(1)使用装饰器装饰FBV
FBV本身就是一个函数,所以和给普通的函数加装饰器无差:
def wrapper(func): def inner(*args, **kwargs): start_time = time.time() ret = func(*args, **kwargs) end_time = time.time() print("used:", end_time-start_time) return ret return inner # FBV版添加班级 @wrapper def add_class(request): if request.method == "POST": class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/") return render(request, "add_class.html")
(2)使用装饰器装饰CBV
类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,我们需要先将其转换为方法装饰器。
Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。
# CBV版添加班级 from django.views import View from django.utils.decorators import method_decorator class AddClass(View): @method_decorator(wrapper) def get(self, request): return render(request, "add_class.html") def post(self, request): class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/")
二、JsonResponse对象
JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。
默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。
def json_test(request): data = {"name": "小黑", "age": 18} data2 = [11, 22, 33, 44]‘’ ### 传统方式 # import json # data_str = json.dumps(data2) # 把data序列化成json格式的字符串 # return HttpResponse(data_str) ### JsonResponse方式 from django.http import JsonResponse return JsonResponse(data2, safe=False)