【问题标题】:How to call a class based generic API view from a custom function based view如何从基于自定义函数的视图中调用基于类的通用 API 视图
【发布时间】:2019-08-13 07:36:24
【问题描述】:

我对如何在我的应用程序中调用我自己的 API 有一些问题和疑问。

所以我有一个可以向其发送数据的 API。我想在不同的视图中做的是调用这个发送的数据,这样我就可以在模板中可视化它。

首先,我尝试使用视图内的库请求调用 API。即使这可行,我在身份验证方面也遇到了问题。所以我想我可以从基于自定义函数的视图中调用基于类的 API 视图。

但我不知道这是否可行,也不知道这是否值得推荐。我还想用javascript来做这件事可能会更好?我不知道....所以我的问题是双重的:

a) 从我自己的应用中调用 API 视图/获取 API 数据以便我可以对其进行操作和可视化的最佳做法是什么

b) 如果这是一种好的做法,我如何从基于自定义函数的视图中调用基于类的通用 API 视图?

这是我目前正在尝试的:

my generic view

class BuildingGroupRetrieveAPIView(RetrieveAPIView):
    """Retrieve detail view API.

    Display all information on a single BuildingGroup object with a specific ID.

    """

    authentication_classes = [JSONWebTokenAuthentication, SessionAuthentication, BasicAuthentication]
    serializer_class = BuildingGroupSerializer
    queryset = BuildingGroup.objects.all()

我尝试调用它的基于函数的视图:

def visualize_buildings(request, id):
    returned_view = BuildingGroupRetrieveAPIView.as_view()
    return returned_view


my url

    path('data/<int:pk>/', BuildingGroupRetrieveAPIView.as_view(),
         name="detail_buildings_api"),

当我调用基于类的视图时,我得到AttributeError: 'function' object has no attribute 'get'

非常感谢您的帮助!提前致谢!

【问题讨论】:

  • 确实没有必要发出实际的 HTTP 请求来获取您的数据,但我无法理解您在 visualize_buildings 中所做的事情。您似乎只是在调用 API 视图并返回它;重点是什么?为什么不删除该函数,直接访问 BuildingGroupRetrieveAPIView URL?
  • 现在我只是想退货,你说得对。但这不起作用,因此编写更多代码没有意义。我的想法实际上是,当我设法从 api 获取数据时,我可以对其进行修改并将其传递给我的模板,然后我可以将其可视化......
  • 好的,但是什么“不起作用”?发生什么了?请注意,as_view() 返回一个视图,即您必须调用的 callablereturn returned_view(request, pk).
  • 是的,我的错我应该补充一下(我更新了我的问题)。它告诉我AttributeError: 'function' object has no attribute 'get'。但是等一下,我会试试你的建议
  • 好的,你需要一个 kwarg,所以试试return returned_view(request, pk=id)

标签: django django-rest-framework django-views django-class-based-views


【解决方案1】:

如果您愿意,您可以在其文件中的声明之后调用您的 CBV,以便在声明其 URL 时方便。

views.py

class BuildingGroupRetrieveAPIView(RetrieveAPIView):
    .....


visualize_buildings = BuildingGroupRetrieveAPIView.as_view()

然后在您的网址上,您使用该名称。

urls.py

from . import views


path('data/<int:pk>/', views.visualize_buildings, name="detail_buildings_api"),

【讨论】:

  • 非常感谢 Higor。但这更多是为了清楚起见我假设并且与直接调用它基本相同?我试试看。
  • 这让我很震惊RecursionError: maximum recursion depth exceeded 足以做到return returned_view(request, pk=id)。但是非常感谢!
  • 它抛出这个错误很奇怪。但你是对的,这是为了清楚起见。我添加了一个我忘记的部分,但它不应该抛出那个错误。
【解决方案2】:

正确方法:

from django.url import reverse, resolve

def get_view_func(name_of_your_view):
    return resolve(reverse(name_of_your_view)).func

# if your are in a drf view:
get_view_func()(request._request)

# if you are in normal django view:
get_view_func()(request)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 2013-02-04
    • 2013-01-25
    • 1970-01-01
    • 2022-01-24
    • 2017-12-31
    • 2014-02-16
    相关资源
    最近更新 更多