【问题标题】:How to expose non-model module methods via Django Rest Framework?如何通过 Django Rest Framework 公开非模型模块方法?
【发布时间】:2015-10-09 12:32:12
【问题描述】:

我正在使用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 呈现的网站中的端点类似于其他(与模型相关的)端点。

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

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

有用的链接

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      urls.py

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

      【讨论】:

      • 错误消失了。但我看不到 API 端点。那么这个 url 是否仍然显示在网站 http://localhost:8000 提供 API 上?
      猜你喜欢
      • 2018-12-02
      • 1970-01-01
      • 2020-04-23
      • 2014-06-10
      • 1970-01-01
      • 2018-07-13
      • 2014-10-27
      • 1970-01-01
      • 2013-11-11
      相关资源
      最近更新 更多