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

Posted

技术标签:

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

【问题讨论】:

【参考方案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 的请求。

【讨论】:

以上是关于如何将 Django 与 Tornado 网络服务器一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Django、websockets、Tornado,如何让它们通信?

自己写一个 wsgi 服务器运行 Django Tornado 等框架应用

框架之Tornado(简单介绍)

tornado 模板引擎

相互SSL身份验证 - 客户端和服务器端。 Python - > Django / Twisted / Tornado

在 Heroku 上部署 Django\Tornado