Django视图系统(View)

Django视图系统(View) 

  一个视图函数(类),简称为视图,是一个简单的 Python 函数(类), 它接受 Web 请求并返回Web响应.响应可以是一张网页HTML内容, 一个重定向, 一个404错误,等,,,

    视图放置在 项目 或者 项目的app 目录中 名字为: views.py 的文件中.

CBV和FBN

FBV

    基于函数的视图. 在视图函数中通过对 request.method 的不同判断进而执行不同的代码.

例:

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

    基于类的视图.

  • 视图类必须继承 django.views.View
  • 在类中定义和请求方法同的方法.
  • urls.py 中注册视图的时候区别于FBV 如: 类名.as_view()

例:

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()),

给视图加装饰器

使用装饰器装饰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")
View Code

使用装饰器装饰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/")
View Code

Request对象和Response对象

request对象

 

posted @ 2020-03-16 23:38  闫世成  阅读(95)  评论(0)    收藏  举报