我必须在给定的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?
答案 0 :(得分:0)
根据API的复杂程度,您可以设计externalAPIApp
视图,使其对CommandExecApp
CBV进行子类化。
我过去曾尝试这样做,但由于基于DRF类的视图的函数签名和返回类型而遇到了障碍。在通过应用程序中的继承(vs组合)扩展功能时,这并不常见。
也就是说,有几种方法可以解决这个问题:
API网关
将externalAPIApp
设计为网关Web服务,实质上通过HTTP将HTTP请求传递到commandExecApp
API。
您可以查看"客户端"的requests库。请求externalAPIApp
将commandExecApp
。{/ p>
共享域模块
考虑应用程序有三个主要组件:
<强>权衡强>
两者都有利弊。
Gateway方法引入了与其他(本地)网络请求相关的一些延迟。另一方面,DRF为开发人员提供了节省时间的功能/组件,使其能够与域逻辑紧密耦合。
共享域模块提供了更多的关注点分离,但可能涉及预先编写和测试更多代码。
最终,这是一项体系结构决策,要了解您的开发进度,技术路线图,相关人员等。