• 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')
      
  • 相关阅读:
    C#操作OFFICE一(EXCEL)
    json的使用二(转)
    xpath简介(转载)
    使用LogParser分析IIS网站日志
    WCF Data Contract KnownTypeAttribute转载
    ExtJs中同一个URL构造多个Ext.data.JsonStore 转载
    转载Ext.form.formPanel 与服务器交互 初始化表单
    oracle表数据误删恢复
    JavaScript基础之Array函数
    Json格式类的转换相关代码转载
  • 原文地址:https://www.cnblogs.com/Hades123/p/11379067.html
Copyright © 2020-2023  润新知