python - 在 Django 中将请求响应转换为 DRF 响应的最优雅方法是什么?

标签 python django django-rest-framework

考虑以下流程:

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())

虽然这适用于正常状态,但它有一些问题:

  1. 它不代理来自服务 b 的实际状态代码。
  2. Response() 中不必要的 json 序列化往返
  3. 如果服务 b 返回非 json 错误,则服务不会从服务 b 返回实际错误。

问题是,有没有更好的方法呢?我看了看 Django Rest Framework Proxy项目,但我不完全确定它是否真的适合我的用例。

最佳答案

  1. 您可以通过修改您的Response来解决状态码部分:

    return Response(resp.json(), status=resp.status_code)
    
  2. 但是对于第二部分,这是代理的本质......(是的,有时你想在代理中间人中操纵请求和/或响应,但你所做的才是本质).

注释:

以上两者的总体思路是,您专门创建一个 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/

相关文章:

python - 使用 docker 和 GPU 进行 Pycharm 调试

python - Discord.py - 如何为每个服务器制作齿轮

java - “JavaPackage”对象不可调用

python - Django 中用户定义的派生数据

python - 使用 db_manager 时,“QuerySet”对象没有属性 'login_name'

django - 无法将 extra_context 添加到 ListView

java - Java 中的包?

django - 允许 CSRF_TRUSTED_ORIGINS django 中的所有 ip

javascript - 我如何在 python django 中使用 REST 来执行多个任务

Django Rest Api 与 Pandas