考虑以下流程:
public client ----> DRF API on Service A ------> DRF API on Service B
服务 A 上的某些 DRF API 仅代理服务 B,因此在服务 A 上的特定 API 中如下所示:
class SomeServiceAPI(APIView):
def get(request):
resp = requests.get('http://service-b.com/api/...')
return Response(resp.json())
虽然这适用于正常状态,但它有一些问题:
- 它不代理来自服务 b 的实际状态代码。
- Response() 中不必要的 json 序列化往返
- 如果服务 b 返回非 json 错误,则服务不会从服务 b 返回实际错误。
问题是,有没有更好的方法呢?我看了看 Django Rest Framework Proxy项目,但我不完全确定它是否真的适合我的用例。
最佳答案
您可以通过修改您的
Response
来解决状态码部分:return Response(resp.json(), status=resp.status_code)
但是对于第二部分,这是代理的本质......(是的,有时你想在代理中间人中操纵请求和/或响应,但你所做的才是本质).
注释:
- DRF Proxy你所建议的似乎只是完成这项工作 很好,不需要你只为 往返。
- 存在另一个工具,DRF Reverse Proxy这是 Django Revproxy 的 DRF 端口您可能需要考虑。
以上两者的总体思路是,您专门创建一个 URL 路径来代理另一个 API 的路径:
DRF 代理:
将您的代理添加到 settings.py
:
REST_PROXY = {
'HOST': 'http://service-b.com/api/'
}
在 urls.py
中:
url(
r'^somewere_in_a/$',
ProxyView.as_view(source='somewere_in_b/'),
name='a_name'
)
DRF 反向代理:
与上面的非常相似,没有设置部分:
url(
r'^(?P<path>.*)$',
ProxyView.as_view(upstream='http://service-b.com/api/somewere_in_b/'),
name='a_name'
)
意见: DRF Proxy看起来更结实...
关于python - 在 Django 中将请求响应转换为 DRF 响应的最优雅方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45610287/