uWSGI用于上传和处理文件

时间:2013-08-15 14:51:13

标签: python uwsgi bottle

我有一个用bottlepy编写的python web应用程序。它的唯一目的是允许人们上传将被处理的大文件(大约需要10-15分钟来处理)。

上传代码我很简单:

@route('/upload', method='POST')
def upload_file():
  uploadfile = request.files.get('fileToUpload')
  if not uploadfile:
    abort(500, 'No file selected for upload')

  name,ext = os.path.splitext(uploadfile.filename)

  if ext not in ['.zip','.gz']:
    abort(500, 'File extension not allowed')

  try:
    uploadfile.save('./files')

    process_file(uploadfile.filename) #this function is not yet implemented

    return "uploaded file '%s' for processing" % uploadfile.filename
  except IOError as e:
    abort(409, "File already exists.")

我计划使用uWSGI部署这个应用程序(但是,如果其他技术更好用于此目的,它不会一成不变。

因此,我对uWSGI用于此目的有一些疑问:

  1. 如果文件上传需要几分钟,uWSGI如何能够在不阻止的情况下处理其他客户端?
  2. 有没有办法可以使用uWSGI中的内置功能卸载处理,以便用户在上传后获得响应并查询处理状态?
  3. 感谢您的帮助。

1 个答案:

答案 0 :(得分:8)

  

如果文件上传需要几分钟,uWSGI将如何处理   处理其他客户端而不阻塞?

它会阻止。 解决方案是将NGINX之类的网络服务器放在uWSGI前面,以预先缓冲POST请求。因此,文件上传实际上绑定到NGINX处理程序,直到完成并且然后传递给uWSGI处理程序。

  

有没有办法可以使用内置的方法卸载处理   uWSGI中的功能,以便用户在上传后获得响应   并可以查询处理状态?

您需要创建一个任务队列系统来从Web处理程序卸载处理。 这是一种常见的最佳做法。只需环顾四周python task queues。 对于内置功能,它实际上取决于您需要卸载的任务。 您可以使用内置uWSGI spooleruWSGI mules。 这些是典型任务队列的非常好的替代方案(如非常着名的Celery)但有局限性。 只需在你的场景中自己尝试一下。