【问题标题】:Post large files to heroku with Python使用 Python 将大文件发布到 heroku
【发布时间】:2014-10-11 18:55:59
【问题描述】:

我正在创建一个将音频文件发布到 API 的 python 脚本。它大部分都在工作;但是,该应用程序位于 Heroku 上,并且大文件似乎被 heroku 的内存限制所占用。我尝试使用 multipart/form-data,但这似乎还不够。我在大约 5 分钟内收到 503 错误。

import requests
import os
import glob
from requests_toolbelt import MultipartEncoder

token = 'XXXX'
headers = {'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json'}
base_url = 'https://test.com/api/'

for file in glob.glob("*.mp3"):
    files = MultipartEncoder(fields={'file': (file, open(file, "rb"), 'audio/mpeg')})
    audio_headers = {'Authorization': 'Bearer ' + token, 'Content-Type': files.content_type}
    add_file = requests.post(base_url, headers=audio_headers, data=files)

【问题讨论】:

  • 我认为 503 实际上是 Heroku 在一段时间内没有响应时为您的应用程序返回的内容。我不确定这是文件大小限制。我不知道如何解决这个问题,也许你应该联系 Heroku 支持,看看他们是否有任何处理这个问题的策略。
  • 谢谢 :) 你今天帮了大忙。
  • 看来问题可能出在我的互联网连接上,因为我今天早上在办公室再次尝试运行它并且没有任何问题。
  • 这真的很奇怪。如果你能复制它,给我发电子邮件。

标签: python rest heroku python-requests


【解决方案1】:

Heroku 对所有请求都有 30 秒的限制。较大的文件肯定会超过该期限,因此请求会超时。唯一的解决方案是直接从浏览器发布到第 3 方存储(例如 Amazon S3),然后向 heroku 发送一个请求,其中包含上传数据的位置。使用后台进程,您将能够下载文件并根据需要进行处理。

【讨论】:

  • 根据heroku's limits docs:HTTP 请求有一个初始的 30 秒窗口,在该窗口中,Web 进程必须返回响应数据(完成的响应或一定数量的响应数据表明进程处于活动状态) .在最初的 30 秒窗口内未发送响应数据的进程将在其日志中看到 H12 错误。在初始响应之后,发送的每个字节(来自客户端或来自您的应用进程)都会重置一个滚动的 55 秒窗口。
猜你喜欢
  • 2010-12-28
  • 1970-01-01
  • 2018-12-02
  • 2012-06-23
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
相关资源
最近更新 更多