如何使用 Django 从用户请求触发的外部 API 获取数据,并将其直接流回请求周期而不使用(或渐进/最小)内存使用?
背景
作为连接外部托管微服务的短期解决方案,需要限制用户对未经身份验证的 API 的访问(基于 Django 应用程序的身份验证系统)。以前的开发人员在 Javascript 中暴露了这些外部 IP,我们需要一个解决方案来让它们远离公众的视线。
要求
- 我们没有义务使用requests如果可以帮助加快响应时间,我们愿意使用任何其他库。
- 来自外部 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
请注意- 我完全意识到这是一个糟糕的长期解决方案,但在新的外部身份验证系统完成之前,为了演示目的,短期内这是必要的。
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
文档:
-
正文内容工作流程 http://docs.python-requests.org/en/master/user/advanced/#body-content-workflow (
stream=True
解释)
- StreamingHttpResponse https://docs.djangoproject.com/en/1.9/ref/request-response/#streaminghttpresponse-objects
- iter_content() http://docs.python-requests.org/en/master/api/#requests.Response.iter_content
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)