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
,并重写 get
和 post
方法以处理不同的请求方法:
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
类,并提供了许多额外的功能,例如:
- 请求解析:
APIView
自动解析请求内容,将请求内容转换为 Python 数据类型。这样,你可以在视图中直接处理原生 Python 数据,而不必担心解析请求内容。 - 响应渲染:
APIView
提供了多种响应渲染器,如 JSON、XML 等,可以根据客户端需求自动选择合适的渲染器。 - 异常处理:
APIView
提供了统一的异常处理机制,可以将捕获的异常转换为适当的 HTTP 响应。 - 认证与权限:
APIView
支持多种认证和权限管理方法,如基本认证、Token 认证、会话认证等。 - 内置的分页和过滤功能:
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
提供的其他功能,如响应渲染、异常处理、认证和权限等。
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)