zoukankan      html  css  js  c++  java
  • Django--FBV + CBV

    FBV + CBV

    django中请求处理方式有2种:FBV 和 CBV

    FBV(function bases views)

    就是在视图里使用函数处理请求,如下:

    # urls.py
    
    from django.conf.urls import url, include
    from app01 import views
     
    urlpatterns = [
        url(r'^index/', views.index),
    ]
    
    # views.py
    
    from django.shortcuts import render
     
    def index(req):
        if req.method == 'POST':
            print('method is :' + req.method)
        elif req.method == 'GET':
            print('method is :' + req.method)
        return render(req, 'index.html')
    

    注意此处定义的是函数【def index(req):】

    <!--index.html-->
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
        <form action="" method="post">
            <input type="text" name="A" />
            <input type="submit" name="b" value="提交" />
        </form>
    </body>
    </html>
    

    FBV中加装饰器相关

    def deco(func):
        def wapper(request,*agrs,**kwargs):
            if request.COOKIES.get('LOGIN'):
                return func(request, *args, **kwargs)     
            return redirect('/login/')
        return wrapper
    
    
    @deco
    def index(req):
        if req.method == 'POST':
            print('method is :' + req.method)
        elif req.method == 'GET':
            print('method is :' + req.method)
        return render(req, 'index.html')
    
    

    上面就是FBV的使用。

    CBV(class bases views)

    就是在视图里使用类处理请求,如下:

    # urls.py
    
    from app01 import views
     
    urlpatterns = [
        url(r'^index/', views.Index.as_view()),
    ]
    
    # views.py
    
    from django.views import View
     
    # 类要继承View ,类中函数名必须小写
    class Index(View):
        def get(self, req):
            '''
            处理GET请求
            '''
            print('method is :' + req.method)
            return render(req, 'index.html')
     
        def post(self, req):
            '''
            处理POST请求
            '''
            print('method is :' + req.method)
            return render(req, 'index.html')
    

    CBV中加装饰器相关

    要在CBV视图中使用我们上面的check_login装饰器,有以下三种方式:

    1. 加在CBV视图的get或post方法上

      from django.utils.decorators import method_decorator
      from django.views import View
      
      class Index(View):
          
          def dispatch(self,req,*args,**kwargs):
              return super(Index,self).dispatch(req,*args,**kwargs)
          
          
          def get(self, req):
              print('method is :' + req.method)
              return render(req, 'index.html')
          
       	@method_decorator(deco)
          def post(self, req):
              print('method is :' + req.method)
              return render(req, 'index.html')
          
      
    2. 加在diapatch方法上,因为CBV中首先执行的就是dispatch方法,所以这么写相当于给get和post方法都加上了登录校验。

      from django.utils.decorators import method_decorator
      from django.views import View
      
      class Index(View):
          
          @method_decorator(deco)
          def dispatch(self,req,*args,**kwargs):
              return super(Index,self).dispatch(req,*args,**kwargs)
          
          
          def get(self, req):
              print('method is :' + req.method)
              return render(req, 'index.html')
          
          def post(self, req):
              print('method is :' + req.method)
              return render(req, 'index.html')
          
      
    3. 直接加在视图类上,但method_decorator必须传name关键字参数

      如果get方法和post方法都需要登录校验的话就写两个装饰器

      from django.utils.decorators import method_decorator
      from django.views import View
      
      
      @method_decorator(deco,name='get')
      @method_decorator(deco,name='post')
      class Index(View):
      
          def dispatch(self,req,*args,**kwargs):
              return super(Index,self).dispatch(req,*args,**kwargs)
          
          
          def get(self, req):
              print('method is :' + req.method)
              return render(req, 'index.html')
          
          def post(self, req):
              print('method is :' + req.method)
              return render(req, 'index.html')
      
  • 相关阅读:
    Redis(八):spring data redis 理解
    RPC服务框架dubbo(六):Consumer搭建过程
    Redis(七):Jedis简介和集群
    RPC服务框架dubbo(四):Dubbo中Provider搭建
    RPC服务框架dubbo(三):Dubbo支持的协议
    RPC服务框架dubbo(二):dubbo支持的注册中心
    RPC服务框架dubbo(一):简介和原理解析
    Java数据结构和算法(一):简介
    Golang gRPC实践 连载五 拦截器 Interceptor
    Go 1.8 http graceful 体验
  • 原文地址:https://www.cnblogs.com/Hades123/p/11379067.html
Copyright © 2011-2022 走看看