【问题标题】:Node.js as a custom (streaming) upload handler for DjangoNode.js 作为 Django 的自定义(流式)上传处理程序
【发布时间】:2011-01-25 02:05:36
【问题描述】:

我想使用 Django 构建一个以上传为中心的应用程序。一种方法是使用 nginx 的上传模块(非阻塞),但它有其问题。 Node.js 应该是此类应用程序的理想选择。但是我怎样才能让 node.js 充当upload_handler() for Django?我不确定在哪里可以找到示例?

【问题讨论】:

    标签: python django javascript node.js uploading


    【解决方案1】:

    让 node.js 将文件写入磁盘并将上传的 POST 与 '_node_file' 值一起代理到 Django,以便您的 Django 视图知道从哪里获取文件。

    【讨论】:

      【解决方案2】:

      好吧,我不是这个主题或任何方面的专家,但我认为我理解它的方式,nginx 是一个代理,运行在为您的 django 应用程序服务的网络服务器前面,对吧?

      您可以构建一个简单的 node.js 服务器来执行相同的操作 - 侦听端口 80,等到请求完全发送到服务器,然后将其转发到为 Django 应用程序提供服务的网络服务器。如果您的问题是长时间运行的上传正在耗尽网络服务器线程,那么我认为这将解决该问题。

      这是一些代码 - 就在我的脑海中

      var http = require('http');
      
      var server = http.createServer(function (req, res) {
          var headers = req.headers;
          var url = req.url;
          var method = req.method;
          var body = '';
          req.addListener('data', function(chunk) {
              body += chunk;
          });
          req.addListener('end', function() {
              // at this point the request is completely uploaded (including files)
              // so it can be forwarded to the django webserver
      
              var dj_client = http.createClient(8000, 'localhost');
              var dj_req = dj_client.request(method, url, headers);
              dj_req.addListener('response', function (dj_res) {
                  // here the response have been received from the django server
                  // so we can return that to the waiting client
                  res.writeHead(dj_res.status, dj_res.headers);
      
                  dj_res.addListener('data', res.write);
                  dj_res.addListener('end', res.close);
              });
      
              // send the request to the django webserver
              dj_req.write(body);
              dj_req.close();
          });
      });
      
      server.listen(80);
      

      【讨论】:

      • 似乎您正在将整个内容缓冲在内存中。那不是流媒体。我不是很喜欢 Django,但它似乎会接受分块下载。
      • @Kuroki - 是的,但我读了原帖,好像这就是重点。为避免在上传期间停止 webservers 线程,即避免直接流式传输到 django 应用程序,而是使用 node.js 对其进行缓冲。
      猜你喜欢
      • 1970-01-01
      • 2013-05-18
      • 2020-11-18
      • 1970-01-01
      • 2012-12-27
      • 2011-12-15
      • 1970-01-01
      • 2015-12-26
      • 2021-10-06
      相关资源
      最近更新 更多