gpt4 book ai didi

python - 如何通过 Django Rest Framework 公开非模型模块方法?

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:40 25 4
gpt4 key购买 nike

我正在使用 Django Rest Framework创建 API。有通过 API 公开的模型类,例如 City。现在我用一些有用的方法创建了一个 utils 模块:

# city/utils.py

def distance_between_cities(city1, city2):
return city1.distance(city2)

我想将示例方法 distance_between_cities 公开为 API 端点。所以我开始创建一个 View :

# city/views.py
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from . import utils

class DistanceView(APIView):

def get(self, request, format=None):
city1 = request.query_params.get('city1', None)
city2 = request.query_params.get('city2', None)
distance = utils.distance_between_cities(city1, city2)
distance_hash = {'distance': distance}
return Response(distance_hash, status=status.HTTP_200_OK)

然后我尝试注册一个路由:

# city/urls.py
from rest_framework.routers import DefaultRouter
from . import views

router = DefaultRouter()
router.register(r'distance', views.DistanceView)

当我访问该网站时,显示以下错误:

base_name argument not specified, and could not automatically determine the name from the viewset, as it does not have a .queryset attribute.

我希望看到 DRF 呈现的网站端点与其他(模型相关)端点类似。

DRF API website

最后,我想通过以下方式访问端点:

http://localhost:8000/api/cities/distance.json?city1=23&city1=42

我尝试通过 curl 检查 API:

$ curl -X HEAD -i http://localhost:8000/api/cities/distance.json?city1=23&city2=42

这是响应头:

HTTP/1.0 404 NOT FOUND
Date: Fri, 09 Oct 2015 16:45:06 GMT
Server: WSGIServer/0.2 CPython/3.4.3
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS

有用的链接

最佳答案

如果您需要列出新的入口点,则需要从 ViewSet 继承(请注意,我不是在谈论 ModelViewSet)。

我在这里写了一个关于如何做到这一点的简短指南和示例项目:https://medium.com/@linovia/django-rest-framework-viewset-when-you-don-t-have-a-model-335a0490ba6f

您不需要所有的 ViewSet 方法,可能只需要根据您的评论列出的方法。

关于python - 如何通过 Django Rest Framework 公开非模型模块方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33038396/

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