1、CBV源码分析

# 视图层
from django.shortcuts import render, HttpResponse
from django.views import View
class CBVTest(View):
    # 通过调度(dispatch)分发请求
    def dispatch(self, request, *args, **kwargs):
        pass
        super().dispatch(request, *args, **kwargs)
        pass

    def get(self, request):
        return render(request, 'cbv.html')

    def post(self, request):
        return HttpResponse('cbv post method')
<!-- 模板层 -->
<form action="/cbv/" method="post">
    {% csrf_token %}
    <input type="text" name="usr">
    <button type="submit">提交</button>
</form>
# 路由层
from app import views
urlpatterns = [
    url(r'^cbv/', views.CBVTest.as_view()),
]

 

2、drf安装与使用

# 1)安装drf:pip3 install djangorestframework # 2)settings.py注册app:INSTALLED_APPS = [..., 'rest_framework'] # 3)基于cbv完成满足RSSTful规范的接口 
# 视图层
from rest_framework.views import APIView
from rest_framework.response import Response
user_list = [{'id': 1, 'name': 'Bob'}, {'id': 2, 'name': 'Tom'}]
class Users(APIView):
    def get(self, request, *args, **kwargs):
        return Response({
            'status': 0,
            'msg': 'ok',
            'results': user_list
        })
    def post(self, request, *args, **kwargs):
        # request对formdata,urlencoded,json三个格式参数均能解析
        name = request.data.get('name')
        id = len(user_list) + 1
        user = {'id': id, 'name': name}
        user_list.append(user)
        return Response({
            'status': '0',
            'msg': 'ok',
            'results': user
        })
# 路由层
from app import views
urlpatterns = [
    url(r'^users/', views.Users.as_view()),
]

 

3、request源码分析

# as_view()
    # 核心走了父类as_view
    view = super(APIView, cls).as_view(**initkwargs)
    # 返回的是局部禁用csrf认证的view视图函数
    return csrf_exempt(view)
    
# dispatch(self, request, *args, **kwargs)
    # 二次封装request对象
    request = self.initialize_request(request, *args, **kwargs)
    # 自定义request规则
    self.initial(request, *args, **kwargs)
    
# initialize_request(self, request, *args, **kwargs)
    # 原生request封装在request._request
    
# initial(self, request, *args, **kwargs)
    # 认证
    self.perform_authentication(request)
    # 权限
    self.check_permissions(request)
    # 频率
    self.check_throttles(request)

 

 

as_view()

as_view() 是 Django REST Framework(DRF)和Django中用于将一个视图类转换为可调用视图函数的方法。
在类基于视图的设计模式下,视图逻辑封装在一个类中,而为了与URL配置进行交互并处理HTTP请求,需要将这个类转化为常规的视图函数

 

   
View和APIView

在 Django REST Framework(DRF)中,View 和 APIView 是两种不同的视图类型:

Django 视图 (View):

Django 自身提供的基础视图类,位于 django.views 包下。
用于处理所有类型的请求(不仅仅是针对API),包括HTML页面、静态内容等。
在处理HTTP请求时,它通常使用 HttpRequest 对象,并返回一个 HttpResponse 对象。
REST框架视图 (APIView):

DRF 中的核心视图基类,位于 rest_framework.views 包下。
特别为构建Web API而设计,提供了许多与API开发相关的功能和便利性。
使用 rest_framework.request.Request 对象代替了标准的 HttpRequest,并且可以返回 rest_framework.response.Response 对象,支持更多格式的数据序列化和反序列化。
内置了对身份验证、权限控制、分页、过滤器、异常处理等功能的支持。
还提供了通用视图如 ListAPIView、CreateAPIView 等,简化了CRUD操作的实现。
总结起来,APIView 是基于 Django 视图 (View) 构建的,专为 RESTful API 开发进行了增强和扩展。在构建 REST API 时,推荐使用 APIView 及其派生类,以充分利用 Django REST Framework 提供的各种特性。

 

 

 

 

 

 

 

 

 

 

 

,

 

1、CBV源码分析

# 视图层
from django.shortcuts import render, HttpResponse
from django.views import View
class CBVTest(View):
    # 通过调度(dispatch)分发请求
    def dispatch(self, request, *args, **kwargs):
        pass
        super().dispatch(request, *args, **kwargs)
        pass

    def get(self, request):
        return render(request, 'cbv.html')

    def post(self, request):
        return HttpResponse('cbv post method')
<!-- 模板层 -->
<form action="/cbv/" method="post">
    {% csrf_token %}
    <input type="text" name="usr">
    <button type="submit">提交</button>
</form>
# 路由层
from app import views
urlpatterns = [
    url(r'^cbv/', views.CBVTest.as_view()),
]

 

2、drf安装与使用

# 1)安装drf:pip3 install djangorestframework # 2)settings.py注册app:INSTALLED_APPS = [..., 'rest_framework'] # 3)基于cbv完成满足RSSTful规范的接口 
# 视图层
from rest_framework.views import APIView
from rest_framework.response import Response
user_list = [{'id': 1, 'name': 'Bob'}, {'id': 2, 'name': 'Tom'}]
class Users(APIView):
    def get(self, request, *args, **kwargs):
        return Response({
            'status': 0,
            'msg': 'ok',
            'results': user_list
        })
    def post(self, request, *args, **kwargs):
        # request对formdata,urlencoded,json三个格式参数均能解析
        name = request.data.get('name')
        id = len(user_list) + 1
        user = {'id': id, 'name': name}
        user_list.append(user)
        return Response({
            'status': '0',
            'msg': 'ok',
            'results': user
        })
# 路由层
from app import views
urlpatterns = [
    url(r'^users/', views.Users.as_view()),
]

 

3、request源码分析

# as_view()
    # 核心走了父类as_view
    view = super(APIView, cls).as_view(**initkwargs)
    # 返回的是局部禁用csrf认证的view视图函数
    return csrf_exempt(view)
    
# dispatch(self, request, *args, **kwargs)
    # 二次封装request对象
    request = self.initialize_request(request, *args, **kwargs)
    # 自定义request规则
    self.initial(request, *args, **kwargs)
    
# initialize_request(self, request, *args, **kwargs)
    # 原生request封装在request._request
    
# initial(self, request, *args, **kwargs)
    # 认证
    self.perform_authentication(request)
    # 权限
    self.check_permissions(request)
    # 频率
    self.check_throttles(request)