• 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')
      
  • 相关阅读:
    风机故障诊断分析方案
    sklearn机器学习的监督学习的各个模型主要调参参数
    由于下载fiddler导致,有网而网页无法访问,解决方法是导入fiddler的代理证书,具体步骤参考下面博客
    主题建模:隐含狄利克雷分布
    pytorch坑
    sklearn学习总结
    C# 串口模拟键盘输入
    C#求 鸡兔同笼 已知鸡兔总头数,总脚数为x,求鸡兔各多少只?
    C#图像显示实现拖拽、锚点缩放功能[转 有耐心的小王]
    C# WinForm窗体及其控件自适应各种屏幕分辨率
  • 原文地址:https://www.cnblogs.com/Hades123/p/11379067.html
Copyright © 2020-2023  润新知