码迷,mamicode.com
首页 > 其他好文 > 详细

django的FBV和CBV

时间:2018-02-25 00:07:30      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:views   login   mes   post   注意   model   count()   pos   密码   


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的方法处理,可以更好的组织程序,使程序看起来更简洁清晰

django的FBV和CBV

标签:views   login   mes   post   注意   model   count()   pos   密码   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!