Django Rest Framework:从外部API调用内部API

时间:2017-12-11 10:01:42

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

我必须在给定的Django Rest Framework中从外部API调用内部API。 当用户单击前端(以Angular为单位)中的某个按钮('View Calendar')时,将调用DRF的API端点('/viewCalendar/')。这是外部API端点。 在views.py端点的/viewCalendar/中,我需要编写代码,以便调用另一个API(比如'/commandExecForCalendar/'),它将实际执行该方法并返回输出。此输出将通过外部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()),

那么,如何编写这两个视图,以便外部视图将请求数据发送到内部并从中获取结果到Response to front-end?

1 个答案:

答案 0 :(得分:0)

根据API的复杂程度,您可以设计externalAPIApp视图,使其对CommandExecApp CBV进行子类化。

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

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

API网关

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

您可以查看"客户端"的requests库。请求externalAPIAppcommandExecApp。{/ p>

共享域模块

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

  1. 外部API:可供外部客户访问和授权的隔离API。
  2. 内部API:可供内部客户访问和授权的独立API。
  3. 域模块:一个独立的Python模块,用于处理与Django ORM的所有交互。
  4. <强>权衡

    两者都有利弊。

    Gateway方法引入了与其他(本地)网络请求相关的一些延迟。另一方面,DRF为开发人员提供了节省时间的功能/组件,使其能够与域逻辑紧密耦合。

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

    最终,这是一项体系结构决策,要了解您的开发进度,技术路线图,相关人员等。