繁体   English   中英

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

[英]Django Rest Framework: Calling Internal API from External API

我必须在给定的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()),

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

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

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

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

API网关

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

您可以查看externalAPIApp将对commandExecApp发出的“客户端”请求的请求库。

共享域模块

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

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

权衡

两者都有优点和缺点。

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

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

最终,要了解您的开发进度,技术路线图,相关人员等,这是一个架构决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM