如何使用请求库处理x_accel_redirect以进行服务器间文件传输

时间:2018-07-16 17:32:45

标签: python django nginx python-requests x-accel-redirect

我们有两台服务器,均在ngix上运行:

  • 服务器A是用于存储视频文件的Flask应用程序

  • 服务器B是处理数据库/应用程序逻辑的Django Web应用程序

Flask应用程序配置为使用X_ACCEL_REDIRECT标头进行文件传输。我希望能够将视频文件从Flask应用程序传输到Django应用程序,然后在将视频文件提供给用户之前将其打包为zip文件(以及其他数据)。

我正在尝试使用以下请求库将视频文件从Flask服务器下载到Django应用程序:

#include <vector>
#include <string>
#include <algorithm>

auto make_c_interface_null_terminated(std::vector<std::string> const &input) -> std::vector<const char*>
{
    auto result = std::vector<const char*>(input.size() + 1);
    auto to_c_str = [](auto&& str) { return str.c_str(); };
    std::transform(begin(input), end(input), begin(result), to_c_str);
    // implied:  result[result.size() - 1] = nullptr
    return result;
}

auto make_c_interface(std::vector<std::string> const &input) -> std::vector<const char*>
{
    auto result = std::vector<const char*>(input.size());
    auto to_c_str = [](auto&& str) { return str.c_str(); };
    std::transform(begin(input), end(input), begin(result), to_c_str);
    return result;
}


extern "C" void c_interface_requires_null(const char** argv);
extern "C" void c_interface_sized(size_t size, const char** args);


void test(std::vector<std::string> const &input)
{
    auto output1 = make_c_interface_null_terminated(input);
    c_interface_requires_null(output1.data());

    auto output2 = make_c_interface(input);
    c_interface_sized(output1.size(), output1.data());
}

当我在Flask服务器设置中打开X_ACCEL_REDIRECT标头时,上面的代码工作正常。但是,启用它们后,我在Django服务器上收到的响应对象具有正确的content_length标头,但是'_content'属性是一个空字节对象:b''。结果是一个zip,其中包含大小为0字节的文件。以下是我们从Flask应用获得的响应。

import requests
def get_files(videos):
  """
  for each video: return a list of tuples (filename, data) where 
  data is bytes-like object containing the file that was retrieved
  from Flask server.
  """
  files = []
  for video in videos:
    response = requests.get(video.url, allow_redirects=True)
    if response.status_code == 200:
      print(response.__dict__) # see output below
      data = response.content
      files.append((video.name, data))
  return files

我知道X_ACCEL_REDIRECT标头可以工作,因为当我在浏览器中访问相同路径时,视频会加载并正常播放,并且前端也能够检索和播放视频。我一直在寻找一种使请求库在整个下午与X_ACCEL_REDIRECT标头一起使用的方法,但到目前为止没有成功。我是否缺少打开该标头支持的选项?帮助将不胜感激。

0 个答案:

没有答案