Node.js作为Django的自定义(流式)上传处理器

2 投票
2 回答
1693 浏览
提问于 2025-04-15 20:10

我想用Django来创建一个以上传为中心的应用程序。有一种方法是使用nginx的上传模块(非阻塞),但这个方法有一些问题。Node.js被认为是这类应用的一个不错选择。但是,我该如何让Node.js充当Django的上传处理器(upload_handler())呢?我不太确定该去哪里找示例。

2 个回答

0

让node.js把文件写入磁盘,并将上传的POST请求转发给Django,同时带上一个'_node_file'的值,这样你的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);

撰写回答