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

时间:2015-10-09 12:32:12

标签: python django django-rest-framework

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

# city/utils.py

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

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

# 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参数,并且无法自动确定视图集中的名称,因为它没有.queryset属性。

我希望看到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

有用的链接

2 个答案:

答案 0 :(得分:4)

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

我在这里写了一篇简短的指南+示例项目:https://medium.com/@linovia/django-rest-framework-viewset-when-you-don-t-have-a-model-335a0490ba6f

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

答案 1 :(得分:0)

在你的urls.py中,你给了router.register()一个DistanceView,它的类型是APIView,但是你必须为它指定一个ViewSet。

django-rest-framework只能确定ViewSets的url映射。因此,您可以手动映射网址,就像使用默认的django应用程序一样。

<强> urls.py

urlpatterns = [
    url(r'distance', views.DistanceView),
]