Django - 收到来自外部网站的流请求

Ian*_*ice 4 python django python-requests

Django如何用于从外部API获取数据,由用户请求触发,并在请求周期中直接将其流回,而无需(或使用渐进/最小)内存使用?

背景

作为与外部托管的微服务连接的短期解决方案,需要将用户可访问性(基于Django应用程序的身份验证系统)限制为未经身份验证的API.以前的开发人员在Javascript中暴露了这些外部IP,我们需要一个解决方案来让他们脱离公众的视线.

要求

  • 我们不一定会使用请求库,并且可以使用任何其他库,如果它可以帮助加快响应时间.
  • 来自外部API的响应可能有点大(5-10MB)并且能够缩短请求周期(通过Ajax> Django>外部API> Django>用户的用户请求)是至关重要的.

这可能吗?如果是这样,你能建议一个方法吗?

from django.shortcuts import Http404, HttpResponse
import requests

def api_gateway_portal(request, path=''):
    # Determine whether to grant access

    # If so, fetch and return data
    r = requests.get('http://some.ip.address/%s?api_key=12345678901234567890' % (path,))

    # Return as JSON 
    response = HttpResponse(r.content, content_type='application/json')
    response['Content-Length'] = len(r.content)

    return response
Run Code Online (Sandbox Code Playgroud)

请注意 - 我完全清楚这是一个糟糕的长期解决方案,但在完成新的外部身份验证系统之前,必须进行短期的演示.

Vla*_*lov 7

import requests

from django.http import StreamingHttpResponse

def api_gateway_portal(request, path=''):
    url = 'http://some.ip.address/%s?api_key=12345678901234567890' % (path,)
    r = requests.get(url, stream=True)

    response = StreamingHttpResponse(
        (chunk for chunk in r.iter_content(512 * 1024)),
        content_type='application/json')

    return response
Run Code Online (Sandbox Code Playgroud)

文档: