Django視圖系統
阿新 • • 發佈:2019-05-14
ora 基於 time() dcl mode 我們 obj per mps
一、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)
Django視圖系統