Django Rest Framework 自定义端点

标签 django django-rest-framework

我最近继承了一个用 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操作,您可以改为添加新的 actionHelloWorldViewSet我们称它为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')

我希望这就是您要找的。

请注意,如果您对 POST 不感兴趣,则不需要 django-rest-framework , PUT , PATCH , DELETE等...您可以简单地添加 path给您的urls.py指向返回 Django JsonResponse 的 Django View 函数包含您的报告的对象。

关于Django Rest Framework 自定义端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59667603/

相关文章:

python - 在 Django 中使用 Ajax 时卡在 View 中

django - 在 Django 中添加 Pushover 集成

python - 类型错误 : post() takes 1 positional argument but 2 were given

python - Django rest framework 允许 lookup_field 有多个选项

django - Django 应用程序中的 Stripe 支付,可发布的 key 错误

python - Django:使用 htaccess 保护 django 应用程序

javascript - 通过javascript更改django中的选择选项

python - Django REST Framework 序列化程序返回对象而不是数据

python - 如何重新排序字典的动态字符串键以将其保存为 JSON

django - drf如何序列化manytomany字段