12-17

Django的View(视图):

一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。

响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。

无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。

CBV和FBV:

FBV: (function based view)基于函数的视图;

CBV:(function based view)基于类的视图;

CBV写法:

复制代码

                from django.views import View


                class AddPublisher(View):
                
                    def get(self, request):
                        print('这个是get')
                        return render(request, 'add_publisher.html')

                    def post(self, request):
                        print('这个是post')

                        return render(request, 'add_publisher.html', {"err_name": add_name, 'err_msg': err_msg})

复制代码

url中的使用:

url(r'^add_publisher/', views.AddPublisher.as_view()),

CBV简单的流程:
  1. AddPublisher.as_view() ——》 view函数
  2. 当请求到来的时候才执行view函数
    1. 实例化AddPublisher ——》 self 
    2. self.request = request
    3. 执行self.dispatch(request, *args, **kwargs)
      1. 判断请求方式是否被允许
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        通过反射获取对应的方法 
          GET ——》 get
          POST ——》 post

      2. 执行获取到的方法 get(request,) 或者post(request,)
      3. 得到HttpResponse对象,返回给self.dispatch
    4. 得到HttpResponse对象,返回django处理

给视图增加装饰器:

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")

复制代码

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/")

复制代码

拓展:

复制代码

# 使用CBV时要注意,请求过来后会先执行dispatch()这个方法,如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。

class Login(View):
     
    def dispatch(self, request, *args, **kwargs):
        print('before')
        obj = super(Login,self).dispatch(request, *args, **kwargs)
        print('after')
        return obj
 
    def get(self,request):
        return render(request,'login.html')
 
    def post(self,request):
        print(request.POST.get('user'))
        return HttpResponse('Login.post')


复制代码

猜你喜欢

转载自blog.csdn.net/qq495966654/article/details/85103811
今日推荐