【问题标题】:accessing the upload file in progress using django + nginx + apache mod_wsgi使用 django + nginx + apache mod_wsgi 访问正在进行的上传文件
【发布时间】:2010-10-23 14:36:17
【问题描述】:

我知道,当我们上传到使用 django 的网络应用程序时,我们无法在服务器完全接收上传文件之前访问它。

所以我的问题是,有没有办法检查/访问正在进行的上传文件的总字节数?

谢谢

【问题讨论】:

    标签: django file upload


    【解决方案1】:

    您可以通过编写自己的 Django 上传处理程序来监控正在进行的上传。您需要做的就是继承django.core.files.uploadhandler.FileUploadHandler 并实现receive_data_chunkfile_complete 方法。

    Django 的upload handler documentation 为您提供所需的详细信息。

    【讨论】:

    • 好吧,在所有文件上传到内存/文件之前,处理程序不会发出任何信号。所以我的问题是我们如何跟踪上传到内存/临时文件的文件字节
    • 自定义文件上传处理程序中的 receive_data_chunk 方法在数据到达时接收数据...它不会等到整个文件上传完毕。
    • 好吧,例如,如果你在前面使用像 Nginx 这样的服务器,它会在文件上传时缓存文件,当它完成时,它会将上传的文件传递给 django 所在的服务器实例正在运行
    【解决方案2】:

    这取决于您的服务器设置。如果您将 Apache 与 mod_python 一起使用,则文件在到达时会流式传输到您的 Django 进程。但是如果你在使用 wsgi 或 fastcgi 的 web 服务器后面运行 Django,那么整个文件将在 django 参与之前被服务器缓冲。那么上面给出的解决方案将不起作用。

    这是“设计使然”,因为捆绑等待文件上传的 fastcgi 进程将是一种很大的浪费。所以你需要做的是使用一个服务器模块,比如 http://redmine.lighttpd.net/wiki/1/Docs:ModUploadProgress 用于 Lighttpd,它在服务器上为你实现了 upload_progress 视图。或者 http://wiki.nginx.org/NginxHttpUploadProgressModule 用于 nginx。

    【讨论】:

    • 您对 WSGI 的概括是错误的。 WSGI 是一个接口定义,它有很多实现,它们的行为方式可能会有所不同,例如如何更频繁地处理请求内容的流式处理与它们一起使用的 Web 服务器而不是 WSGI执行。例如,在 Apache/mod_wsgi 本身中没有请求内容的缓冲并且可以流式传输。不过,您在 Apache/mod_wsgi 前面粘贴了一个 nginx 前端代理,并且在代理时它会随着 nginx 缓冲区而改变。
    【解决方案3】:
    【解决方案4】:

    刚找到一个apache的上传进度模块:

    http://github.com/drogus/apache-upload-progress-module

    我不知道它如何(或是否)与 django 和 mod_wsgi 一起工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2011-08-13
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      相关资源
      最近更新 更多