django的FBV和CBV


title: python djano CBV FBV
tags: python, djano, CBV, FBV
grammar_cjkRuby: true

python django的function的定义方法

在处理URL的调用方法的function里面,可能会这样定义

Fuction Based View
在视图中用函数来处理请求

def get():
if method == "GET":
       XXX
	
def post():
if method == "POST":
      XXX

classes Based view
在视图中用类来处理
必须要引入django的view类
在CBV的方式下,请求的步骤是

  1. 请求先被发给dispatch方法
  2. 如果子类中没有实现dispatch方法,则去找父类的这个方法
  3. 该方法中通过获取request.method的请求方式,通过反射的方式实现各种请求的处理

我们可以看看父类的dispatch方法的实现

   if request.method.lower() in self.http_method_names:
   
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed) #获取方法的小写形式,通过反射的方式进行返回
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)

所以在自定义get post这些类方法的时候,需要post get都是小写的,因为父类的dispatch已经定义了会去寻找对应的小写的post get方法名

注意CBV必须用as_views()方法处理请求
要用as_views方法必须引入from django import views

下面看一个简单用CBV的方式写的处理用户登陆的例子
为了证明dispatch方法可以处理分发用户的请求,我们可以看到在例子中,用了父类的dispatch方法处理用户的请求,并分别在请求分发前后做了打印

#coding:utf-8
from django.shortcuts import render
from django.shortcuts import redirect
from django import views
from app01 import models


class Login(views.View):


    def dispatch(self, request, *args, **kwargs):
        print "before dispatch"
        rep = super(Login, self).dispatch(request, *args, **kwargs)
        print "after dispatch"
        return rep


    def post(self, request):
        # models.Administrator.objects.create(username = "root", password =
        # "123123")
        msg = ''
        print 'start...'
        print request.method
        username = request.POST.get('username')
        password = request.POST.get('password')
        c = models.Administrator.objects.filter(username = username,
                password = password).count()
        d = models.Administrator.objects.filter(username = username,
                password = password)
        if c:
            rep = redirect('/index.html')
            rep.set_cookie('username', username, max_age = 20, httponly =
                   True)
            rep.set_signed_cookie('email', "aaabbb", httponly = True)
            return rep
        else:
             msg = "用户名密码有错误"
             return render(request, "login.html", {'msg': msg})


    def get(self, request, *args, **kargs):
          return render(request, 'login.html')

用类的方式编写处理get post,即用CBV的方法处理,可以更好的组织程序,使程序看起来更简洁清晰

原文地址:https://www.cnblogs.com/haozike/p/django_fbv_cbv.html