【问题标题】:How use Django with Tornado web server?如何将 Django 与 Tornado 网络服务器一起使用?
【发布时间】:2011-02-01 20:08:03
【问题描述】:

如何将 Django 与 Tornado 网络服务器一起使用?

【问题讨论】:

    标签: ajax django webserver comet tornado


    【解决方案1】:

    非常简单(尤其是 django 1.4)。

    1 - 只需构建您的 django 项目(和应用程序)并确保它工作正常。

    2- 在根文件夹(与您使用 django-admin.py startproject 相同的目录)创建一个新的 python 文件

    3- 然后复制下面的代码,编辑 os.environ['DJANGO_SETTINGS_MODULE'] 行,并将其粘贴到新的 .py 文件中。

    import os
    import tornado.httpserver
    import tornado.ioloop
    import tornado.wsgi
    import sys
    import django.core.handlers.wsgi
    #sys.path.append('/home/lawgon/') # path to your project ( if you have it in another dir).
    
    
    def main():
        os.environ['DJANGO_SETTINGS_MODULE'] = 'myProject.settings' # path to your settings module
        application = django.core.handlers.wsgi.WSGIHandler()
        container = tornado.wsgi.WSGIContainer(application)
        http_server = tornado.httpserver.HTTPServer(container)
        http_server.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    
    if __name__ == "__main__":
        main()
    

    Django 1.6+ 应该是这样的:

    import os
    import tornado.httpserver
    import tornado.ioloop
    import tornado.wsgi
    from django.core.wsgi import get_wsgi_application
    
    def main():
        os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings' # path to your settings module
        application = get_wsgi_application()
        container = tornado.wsgi.WSGIContainer(application)
        http_server = tornado.httpserver.HTTPServer(container)
        http_server.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

    • 太棒了!我真的很期待尝试一下!
    • 如何调用new.py文件
    • 怀疑:当然,这不会使 Django 神奇地异步,而且 Python 也不是一种出色的多线程语言。所以,这个服务器不支持同时处理多个请求,对吗?
    • 请注意,这不会提供静态文件。
    • @AlanFranzoni Tornado 不仅仅是异步的。关键是与 Apache 或 Nginx 相比,它的启动和运行速度更快、重量更轻,而且更易于管理。
    【解决方案2】:

    更新:

    我创建了一个最小的工作演示,展示了如何使用 Tornado 网络服务器与 django 完美运行:

    https://github.com/tamasgal/django-tornado

    原帖:

    备注:WSGI 应用程序工作流程已从 1.6 更改为 1.7。您必须替换导入

    import django.core.handlers.wsgi
    

    from django.core.wsgi import get_wsgi_application
    

    并从

    更改应用程序初始化
    application = django.core.handlers.wsgi.WSGIHandler()
    

    application = get_wsgi_application()
    

    这是 Moayyad Yaghi 回答的修改后的代码:

    import os
    import tornado.httpserver
    import tornado.ioloop
    import tornado.wsgi
    import sys
    import django.core.handlers.wsgi
    from django.core.wsgi import get_wsgi_application
    #sys.path.append('/home/lawgon/') # path to your project ( if you have it in another dir).
    
    
    def main():
        os.environ['DJANGO_SETTINGS_MODULE'] = 'myProject.settings' # path to your settings module
        application = django.core.handlers.wsgi.WSGIHandler()
        application = get_wsgi_application()
        container = tornado.wsgi.WSGIContainer(application)
        http_server = tornado.httpserver.HTTPServer(container)
        http_server.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

      【解决方案3】:

      有一个名为tornado-proxy 的项目可以帮助您。但我想建议你使用Nginx。在 Nginx 配置中,您现在可以使用 proxy_pass 来引导您的调用,如下所示:

      location /comet {
        proxy_pass http://localhost:8081;
      }
      
      location / {
        proxy_pass http://localhost:8080;
      }
      

      【讨论】:

      • Django 不是网络服务器。它带有一个基本的 Web 服务器来帮助开发 Django 项目,但不适合在生产环境中使用。
      • 完全正确,尽管我认为 xRobot 使用 Django(带有它的网络服务器)作为构建他的网络项目的完整网络服务器/框架。我没有告诉他细节。
      • 我在电脑上玩过聊天和龙卷风,效果很好。在我的服务器上,我正在使用 nginx 和 django 框架,但我不知道将 Tornado 放在哪里。附:您是否也尝试过 Nginx 的推送模块?谢谢;)
      • 对不起,我没有。但是“放龙卷风”是什么意思?我的项目的子文件夹中有我的 Tornado 源代码,然后我开始使用: sudo nginx -c conf/nginx.conf
      • 啊好的...我将在子文件夹中插入 Tornado 源。谢谢^_^
      【解决方案4】:

      在现实世界中,您可以使用WSGI 连接 Django 和一些可用于生产的网络服务器。这个演示展示了如何从一个提供不同 URL 前缀的 python 模块并排运行 Tornado(和它的网络服务器)和 Django:https://github.com/bdarnell/django-tornado-demo。 不过,Tornado 会阻止处理任何指向 Django 的请求。

      【讨论】:

        猜你喜欢
        • 2021-03-31
        • 1970-01-01
        • 2011-07-01
        • 1970-01-01
        • 2011-07-19
        • 2023-03-15
        • 1970-01-01
        • 2011-10-31
        • 2011-02-25
        相关资源
        最近更新 更多