在Django Rest Framework中重定向API请求

时间:2017-05-16 13:24:37

标签: django django-rest-framework

我有一个双层后端架构:

  • a" front"服务器,为Web客户端提供服务。此服务器的代码库与第三方开发人员共享
  • a" back"服务器,它拥有绝密专有kick-ass算法,并有一个端点来进行计算

当客户端向" front"中的特定端点发送请求时服务器,服务器应该将请求传递给"返回"服务器。后台服务器然后处理一些数字,并返回结果。

实现它的一种方法是使用requests库。更简单的方法是拥有"前线"服务器只需将请求重定向到"返回"服务器。我在两台服务器上都使用DRF。

使用DRF重定向ajax请求吗?

1 个答案:

答案 0 :(得分:1)

您甚至不需要DRF向urlconf添加重定向。您需要重定向的所有内容都是一个简单的规则:

urlconf = [
    url("^secret-computation/$",
        RedirectView.as_view(url=settings.BACKEND_SECRET_COMPUTATION_URL))),
    url("^", include(your_drf_router.urls)),
]

当然,您可以将其扩展到正确的DRF视图,将其注册到DRF的路由器(而不是直接将url添加到urlconf)等等 - 但没有多大意义这样做只是为了返回一个重定向响应。

但是,上面的代码只适用于GET请求。您可以继承HttpResponseRedirect以返回HTTP 307(用您自己的简单视图类或函数替换RedirectView),并且根据您的客户端,事情可能会也可能不起作用。如果您的客户是网络浏览器,那些可能包括IE9(或更糟),那么307将无济于事。

所以,除非你的客户知道一切都很好(并且在非恶意网络上没有任何奇怪的方式 - 太聪明的代理 - 你永远不会相信那些可能对HTTP请求做的疯狂),我建议实际代理请求。

代理可以在Django中完成 - 编写使用GenericViewSet库的requests子类 - 或者使用前面的内容,例如: nginx或Caddy(或您最了解的任何其他HTTP服务器/负载均衡器)。

出于生产目的,您可能有一个前端网络服务器,我建议使用它。这样可以节省实现时间和一些服务器资源,因为您的“前端”Django项目甚至不必处理请求并在等待响应时让工作人员忙碌。

出于开发目的,您的选择可能会有所不同。如果您使用裸runserver,那么代理视图可能是您的最佳选择。如果您使用例如Docker,你可能只是在Django容器前面输入一个HTTP服务器容器。

例如,我目前有一个双项目设置(遗留的Django 1.6项目和更新的Django 1.11项目,共享相同的数据库)和前面的Caddy server,基于每个URL进行路由。使用简单的9行Caddyfile就可以了:

:80
tls off
log / stdout "{common}"
proxy /foo project1:8000 {
    transparent
}
proxy / project2:8000 {
    transparent
}

(这是一个开发模式配置。)如果你可以有类似的东西,那么,我想,这将是最简单的选择。