Django视图系统

一、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)
原文地址:https://www.cnblogs.com/timetellu/p/10859745.html