同步读取Djang旁边的多部分上传

2024-04-28 13:58:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django应用程序,它需要能够在上传时将多部分文件上传为类似文件的对象,,这意味着我需要或多或少地同步访问request对象,以及将其分块解包为二进制数据的方法。不幸的是,Django通过将上传直接移动到内存或临时文件来处理上传,这在我的用例中不起作用。在

有人建议我使用gevent/greenlet来处理上传,但我不确定这对等式有何影响,以及Django需要什么设置才能使其工作。另外,在Django之外运行某些东西意味着我必须实现一个数据库连接层来验证是否允许上传(使用票证id)。在

说到这里,我怎么能设置这个呢?Django应该在WSGI应用程序中运行,有人还建议编写第二个WSGI应用程序来捕获用于上载的单个URL路径。实际上,我希望尽可能多地利用Django框架,同时能够同步地读取上传内容?在

(我刚刚熟悉了requestsPython库,不得不说我是一个相当大的粉丝,尽管我不知道在服务器上下文中使用它的第一件事。)


Tags: 文件数据对象django方法内存应用程序wsgi
2条回答

我相信这些建议中有很多都过于复杂。在

你需要改变Django处理上传文件的方式吗?只需修改the upload handler。在

base class相对简单,它提供了很多很棒的钩子。你应该能够扩展它来做你想做的事情。在

虽然我不能为您编写所有的代码(这很复杂),下面是我推荐的设置。在

  1. 使用Tornado+Django:Tornado可以嵌入WSGI进程,因此这使您能够拥有一个单独的进程宿主Django和这个一次性的Tornado处理程序。下面是我的一个活动项目的一个快速示例(虽然这个项目使用了龙卷风作为插座.io汉德勒,它应该告诉你解决方法的要点(:

    # Socket Server
    db = momoko.Pool(DB_DSN, **DB_CONFIG)
    router   = tornadio2.TornadioRouter(QueryRouter, user_settings={'db':db})
    sock_app = tornado.web.Application(router.urls, flash_policy_port = FL_PORT, flash_policy_file = path.join(PROJECT_ROOT, 'assets/xml/flashpolicy.xml'), socket_io_port = WS_PORT, debug=True)
    # Django Server
    os.environ['DJANGO_SETTINGS_MODULE'] = 'sever.settings'
    application = django.core.handlers.wsgi.WSGIHandler()
    container = tornado.wsgi.WSGIContainer(application)
    
    
    # Start the web servers
    if __name__ == "__main__":
        try:
            import logging
            tornado.options.parse_command_line()
            logging.getLogger().setLevel(logging.INFO)
            logging.info('Server started')
            tornado.locale.set_default_locale('us_US')
            http_server = tornado.httpserver.HTTPServer(container)
            http_server.listen(8000)
            tornadio2.SocketServer(sock_app, auto_start=True)
            tornado.ioloop.IOLoop.instance().start()
        except KeyboardInterrupt:
            tornado.ioloop.IOLoop.instance().stop()
            logging.info("Stopping servers.")
    

这可以很容易地转换为在两个不同端口上运行的两个服务器实例,其中80个为Django保留,8080用于上载处理程序。在

  1. 我推荐Tornado是因为它支持流式请求体,非常适合这种类型的使用。Here's a gist that might help you

  2. 你的代理设置很重要。如果您正在使用NGINX,请确保关闭proxy_buffering。

  3. 我不会用数据库来检查机票/上传。Redis或memcache可能是处理这一问题的更快的方法。缓存也是在Django和Tornado之间来回上传进度的好方法,因为设置/获取新值的开销非常小。

这是一个棘手的大问题,将严肃的工程设计出一些优雅的东西,但这是可行的。在

相关问题 更多 >