zoukankan      html  css  js  c++  java
  • 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的方法处理,可以更好的组织程序,使程序看起来更简洁清晰

  • 相关阅读:
    win7-64位,vs32位,odbc 连接oracle问题总结
    vscode 格式化代码
    vue 自动切换导航图
    Unexpected console statement
    css flex 布局之---骰子
    vue百度地图在IE11下空白
    css使用font-face
    centos7计划任务
    MySQL(Mariadb)主从同步基础
    Ubuntu(16.04) 常见问题
  • 原文地址:https://www.cnblogs.com/haozike/p/django_fbv_cbv.html
Copyright © 2011-2022 走看看