gpt4 book ai didi

Django Rest Framework 自定义端点

转载 作者:行者123 更新时间:2023-12-05 01:13:48 25 4
gpt4 key购买 nike

我最近继承了一个用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com