【问题标题】:Django Rest Framework: Calling Internal API from External APIDjango Rest Framework:从外部 API 调用内部 API
【发布时间】:2018-05-24 19:46:48
【问题描述】:

我必须在给定的 Django Rest Framework 中从外部 API 调用内部 API。 当用户单击前端(在 Angular 中)中的某个按钮('View Calendar')时,会调用 DRF 的 API 端点('/viewCalendar/')。这是外部 API 端点。 在/viewCalendar/ 的端点的views.py 中,我需要编写代码以调用另一个API(例如'/commandExecForCalendar/'),该API 将实际执行该方法并返回输出。此输出将由外部 API 进一步响应前端。 外部和内部 API 都位于同一个 DRF 项目中。

 myDRFProj/
   commandExecApp/
       views.py -------- > this  CBV works for internal calls
       .
       .
   externalAPIApp/
       views.py  -------- > this CBV handles API call from front-end and it will call the API for internal calls

   mydrfproj/
       settings.py
       urls.py ---------- > holds both external and internal API endpoints

urls.py

 url(r'commandExecForCalendar', commandExecAppView.cmdExcFrCalendar.as_view()),
 url(r'viewCalendar', externalAPIAppView.extApiCall.as_view()),

那么,如何编写这两个视图,以便外部视图将请求数据发送到内部,并从中获取结果响应到前端?

【问题讨论】:

  • 这是帮助方法或包有用的地方。您可以移动要从多个位置调用的代码的主要实现,同时保持 REST API 端点相同。因此,如果您将 commandExecApp 中的代码抽象为辅助方法或类,并导入该模块以供 externalAPIApp 使用,您将获得所需的内容,而无需显式发出 HTTP 请求

标签: rest api django-rest-framework django-views


【解决方案1】:

根据 API 的复杂性,您可以设计 externalAPIApp 视图,使其子类化 CommandExecApp CBV。

我过去曾尝试过此方法,但由于基于 DRF 类的视图的函数签名和返回类型而遇到了障碍。在应用程序中通过继承(相对于组合)扩展功能时,这种情况并不少见。

也就是说,有几种方法可以解决这个问题:

API 网关

externalAPIApp 设计为充当网关Web 服务,本质上通过HTTP 将HTTP 请求传递到commandExecApp API。

您可以查看requests 库,了解externalAPIApp 将向commandExecApp 发出的“客户端”请求。

共享域模块

考虑应用程序的三个主要组件:

  1. 外部 API:独立的 API,可供外部客户端访问和授权。
  2. 内部 API:一个独立的 API,可供内部客户端访问和授权。
  3. 域模块:一个独立的 Python 模块,处理与 Django ORM 的所有交互。

权衡

两者各有利弊。

网关方法引入了一些与额外(本地)网络请求相关的延迟。另一方面,DRF 为开发人员提供了节省时间的功能/组件,这些功能/组件有助于它们与域逻辑紧密耦合。

共享域模块提供了更大的关注点分离,但可能需要预先编写和测试更多代码。

最终,这是一个架构决策,需要了解您的开发计划、技术路线图、相关人员等。

【讨论】:

  • 感谢您的宝贵意见。我在这里所做的:外部 API 使用 requests.method() 调用内部 API。为了发送 request.data,我使用了 json.dumps(reeust.data) 。当内部 API 响应时,数据从 dict 转换为 json()。但是,这是一种测试目的的方法。还通过创建内部类的对象来做到这一点。两者都有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
相关资源
最近更新 更多