1. 程式人生 > >Django視圖系統

Django視圖系統

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視圖系統