我最近继承了一个用 Django 和 DRF 构建的 API。我需要向 API 添加一些端点,但之前从未使用过 Django 或 DRF,所以我试图尽快跟上进度。
我想知道如何进行自定义端点,而不仅仅是翻译/来自后端数据库的数据。例如,一个端点可能是从数据库读取数据然后编译报告并以 JSON 格式将其返回给调用者的端点。但我想现在最简单的方法是,当端点被命中时,只需将“Hello World”打印到日志并返回一个空白页。
如果这看起来很基本,我深表歉意。我一直在阅读文档,到目前为止,我所看到的只是关于序列化程序的内容,而我真正需要的是能够调用自定义代码块。
谢谢。
最佳答案
如果您希望您的 REST 端点具有所有:GET、POST、PUT、DELETE 等功能,那么您必须在 urls.py 中注册一个路由:
urls.py:
from rest_framework import routers
from django.urls import path, include
from . import views
router = routers.DefaultRouter()
router.register(r'hello', views.HelloWorldViewSet)
urlpatterns = [
# Wire up our API using automatic URL routing.
# rest_framework api routing
path('api/', include(router.urls)),
# This requires login for put/update while allowing get (read-only) for everyone.
path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
现在 url:/hello/指向 HelloWorldViewSet。
在您的 views.py 中添加将从 rest_framework.viewsets.ViewSet 类继承的 HelloWorldViewSet。您可以通过定义以下“操作”来覆盖 ViewSet 默认类行为:list()、create()、retrieve()、update()、partial_update()、destroy()。用于显示 "hello world"
在 GET
你只需要覆盖 list()
:
所以在你的 views.py 中:
from rest_framework import viewsets
from rest_framework.response import Response
class HelloWorldViewSet(viewsets.ViewSet):
def list(self, response):
return Response('Hello World')
所以,在你更高级的list()
您必须与数据库交互的功能,检索所需数据,处理它并将报告创建为 json 可序列化字典并将其作为 Response
返回对象。
如果你不想覆盖标准 list
操作,您可以改为添加新的 action
到HelloWorldViewSet
我们称它为report
:
所以在你的 views.py 中:
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import action
class HelloWorldViewSet(viewsets.ViewSet):
@action(detail=False)
def report(self, request, **kwargs):
return Response('Hello World')
我希望这就是您要找的。p>
请注意,如果您对 POST
不感兴趣,则不需要 django-rest-framework , PUT
, PATCH
, DELETE
等...您可以简单地添加 path
给您的urls.py
指向返回 Django JsonResponse
的 Django View 函数包含您的报告的对象。
关于Django Rest Framework 自定义端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59667603/