django的FBV和CBV
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的方式下,请求的步骤是
- 请求先被发给dispatch方法
- 如果子类中没有实现dispatch方法,则去找父类的这个方法
- 该方法中通过获取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的方法处理,可以更好的组织程序,使程序看起来更简洁清晰