Django之CBV

简介: CBV,即Class Base View,类基本视图。在写API时,我们通常都是使用CBV,而非FBV (Function Base View)。1.

CBV,即Class Base View,类基本视图。
在写API时,我们通常都是使用CBV,而非FBV (Function Base View)。

1. cbv遇到要加装饰器时

  1. 需要先导入 from django.utils.decorators import method_decorator
  2. 在指定方法上方加@method_decorator(x1) ,其中x1是你希望添加的装饰器
import json
from django.shortcuts import render, HttpResponse
from django.utils.decorators import method_decorator
from django.views import View


class AssetView(View):
    """
    资产相关接口
    """

    @method_decorator(x1)
    def get(self, requset, *args, **kwargs):
        host_list = ['c1.com', 'c2.com', 'c3.com']
        return HttpResponse(json.dumps(host_list))

    @method_decorator(x2)
    def post(self, request, *args, **kwargs):
        info = json.loads(request.body.decode('utf-8'))
        print(info)
        return HttpResponse('收到了')

2. CBV中免除CSRF认证

需要先导入from django.views.decorators.csrf import csrf_exempt

方式一

直接在视图class上加@method_decorator(csrf_exempt, name='dispatch')

import json
from django.shortcuts import render, HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.views import View

# 方式一
@method_decorator(csrf_exempt, name='dispatch')
class AssetView(View):
    """
    资产相关接口
    """

    def get(self, requset, *args, **kwargs):
        host_list = ['c1.com', 'c2.com', 'c3.com']
        return HttpResponse(json.dumps(host_list))


    def post(self, request, *args, **kwargs):
        info = json.loads(request.body.decode('utf-8'))
        print(info)
        return HttpResponse('收到了')
方式二

在视图class中加入如下段代码:

# 方式二
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
     return super().dispatch(request, *args, **kwargs)

示例如下:

import json
from django.shortcuts import render, HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.views import View

class AssetView(View):
    """
    资产相关接口
    """

    # 方式二
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
         return super().dispatch(request, *args, **kwargs)


    def get(self, requset, *args, **kwargs):
        host_list = ['c1.com', 'c2.com', 'c3.com']
        return HttpResponse(json.dumps(host_list))


    def post(self, request, *args, **kwargs):
        info = json.loads(request.body.decode('utf-8'))
        print(info)
        return HttpResponse('收到了')

3. django rest_framework

  • 自动加csrf_exempt
  • 页面变好看
  • 自动反序列化
from rest_framework.views import APIView
from rest_framework.response import Response


class AssetView(APIView):
    def get(self, requset, *args, **kwargs):
        host_list = ['c1.com', 'c2.com', 'c3.com']
        # return HttpResponse(json.dumps(host_list))
        return Response(host_list)

    def post(self, request, *args, **kwargs):
        # info = json.loads(request.body.decode('utf-8'))
        # print(info)
        print(request.data)     # json格式
        return HttpResponse('收到了')
相关文章
|
5月前
|
Go 调度 Python
Django 视图探秘:FBV与CBV注册方式的异同,揭秘as_view()的执行魔法
Django 视图探秘:FBV与CBV注册方式的异同,揭秘as_view()的执行魔法
Django-视图CBV执行流程详解
FBV和CBV其实就是要么写函数要么写类,那么内部原理是怎么实现? FBV写法 def func_view(request): "Function views" if request.
1558 0
|
Web App开发 Go Python
源码解析Django CBV的本质
Django CBV模式的源码解析 通常来说,http请求的本质就是基于Socket Django的视图函数,可以基于FBV模式,也可以基于CBV模式。 基于FBV的模式就是在Django的路由映射表里进行url和视图函数的关联,而基于CBV的模式则是在views.
1425 0
第05章节-Python3.5-Django的CBV和FBV 4
4. FBV & CBV function base view url.py index -> 函数名 view.py def 函数(request): .
1345 0
|
数据安全/隐私保护 Python
|
Python
如何在DJANGO里获取?带数据的东东,基于CBV
用DEF的,有现成的,而用CLASS的,就要作一下变通。 如下: if self.request.GET: if self.request.GET.get('search_pk'): search_pk = self.
975 0