Django view 层 apiview 基类封装

需求

Django 框架中,view处理请求方法的get、post请求,请封装一个方法或注解,来对请求的参数、方法进行统一封装处理,以达到最优雅的代码写法,按照谷歌项目实战。

实现

请根据google项目开发经验,给出更好的处理view 接收参数的封装方法

根据 Google 项目的开发经验,可以考虑使用 Django 的类视图(Class-Based Views, CBV)来优雅地处理视图接收参数。类视图允许你通过继承和扩展现有类来轻松地添加或修改功能。以下是使用类视图处理 GET 和 POST 请求的示例:

首先,创建一个基类视图 BaseView,该视图将处理请求参数的封装:

from django.http import JsonResponse
from django.views import View

class BaseView(View):
    def dispatch(self, request, *args, **kwargs):
        if request.method == "POST":
            request_data = request.POST
        else:
            request_data = request.GET
        kwargs.update({"request_data": request_data})
        return super().dispatch(request, *args, **kwargs)

然后,创建一个新的视图类 YourView,该视图继承自 BaseView,并重写 getpost 方法以处理不同的请求方法:

class YourView(BaseView):
    def get(self, request, request_data):
        # 处理 GET 请求逻辑
        ...
        response_data = {
            "success": True,
            "message": "Your response message",
            ...
        }
        return JsonResponse(response_data)

    def post(self, request, request_data):
        # 处理 POST 请求逻辑
        ...
        response_data = {
            "success": True,
            "message": "Your response message",
            ...
        }
        return JsonResponse(response_data)

最后,在 urls.py 文件中引入新创建的视图类,并将其添加到 URL 路由中:

from django.urls import path
from .views import YourView

urlpatterns = [
    path('your-url/', YourView.as_view(), name='your_view'),
    ...
]

这样,我们通过继承和重写类视图的方法,为 GET 和 POST 请求分别创建了不同的处理函数。这种方法遵循了 Google 项目的开发经验,使代码更简洁、可读性更强,同时也方便维护和扩展。

请说明 View 和 APIView 类的区别,上述为什么不用 apiview

Django 中的 View 类是基本的视图类,用于处理常见的 HTTP 请求。它不包含特定于 RESTful API 的功能。与之相反,Django REST framework 提供了一个 APIView 类,它是一个针对于构建 RESTful API 的视图类。APIView 类继承自 Django 的 View 类,并提供了许多额外的功能,例如:

  1. 请求解析:APIView 自动解析请求内容,将请求内容转换为 Python 数据类型。这样,你可以在视图中直接处理原生 Python 数据,而不必担心解析请求内容。
  2. 响应渲染:APIView 提供了多种响应渲染器,如 JSON、XML 等,可以根据客户端需求自动选择合适的渲染器。
  3. 异常处理:APIView 提供了统一的异常处理机制,可以将捕获的异常转换为适当的 HTTP 响应。
  4. 认证与权限:APIView 支持多种认证和权限管理方法,如基本认证、Token 认证、会话认证等。
  5. 内置的分页和过滤功能:APIView 支持分页和过滤,这在处理大量数据时非常有用。

在本示例中,我们使用了 Django 的 View 类而非 Django REST framework 的 APIView 类,主要原因是示例关注的是基本的 HTTP 请求处理,并未涉及到 RESTful API 的特性。使用 View 类可以满足基本需求,而无需引入额外的依赖。如果你打算构建一个 RESTful API,那么使用 APIView 类将更为合适,因为它提供了更多的功能和灵活性。

请用 APIView 类替换上边的基类

要使用 Django REST framework 的 APIView 类替换上面的基类,首先确保已经安装了 Django REST framework。接下来,我们将修改基类以继承自 APIView 类,并移除原有的请求参数封装逻辑,因为 APIView 类已经自动处理了请求参数。以下是修改后的基类:

base_apiview.py

from rest_framework.views import APIView

class BaseAPIView(APIView):
    """
    基础的 APIView 类,用于处理 GET 和 POST 请求。

    该类继承自 Django REST framework 的 APIView 类,并提供了基础的请求处理逻辑,
    包括自动解析请求内容和处理请求参数,以及返回响应数据。可以根据需要在派生类中扩展更多的功能。
    """
    pass

然后,我们修改视图类 YourView,使其继承自 BaseAPIView。由于 APIView 自动处理了请求参数,我们只需将 request_data 参数替换为 request.data

class YourView(BaseAPIView):
    def get(self, request):
        request_data = request.query_params
        # 处理 GET 请求逻辑
        ...
        response_data = {
            "success": True,
            "message": "Your response message",
            ...
        }
        return Response(response_data)

    def post(self, request):
        request_data = request.data
        # 处理 POST 请求逻辑
        ...
        response_data = {
            "success": True,
            "message": "Your response message",
            ...
        }
        return Response(response_data)

最后,在 urls.py 文件中引入新创建的视图类,并将其添加到 URL 路由中,这一步与之前相同:

from django.urls import path
from .views import YourView

urlpatterns = [
    path('your-url/', YourView.as_view(), name='your_view'),
    ...
]

通过这些修改,我们已经将原始的基类替换为了 Django REST framework 的 APIView 类。现在,视图类可以自动处理请求参数,并利用 APIView 提供的其他功能,如响应渲染、异常处理、认证和权限等。

为者常成,行者常至