如何使用Django与Tornado web服务器?

28

我如何在Tornado Web服务器中使用Django?

4个回答

46

非常简单(特别是使用 Django 1.4)。

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

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

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()

1
太棒了!我真的很期待尝试一下! - Jon
1
疑问:当然,这并不会让Django自动变成异步的,而且Python也不是一个很好的多线程语言。因此,这个服务器不支持同时处理多个请求,我说得对吗? - Alan Franzoni
1
请注意,这不会提供静态文件。 - Marco Lavagnino
@uchuugaka 当然它更轻巧了...因为它是单线程的!不过,你得先定义一下“更快”的意思...它可能在启动和处理单个请求方面更快,但如果有多个并发请求,它会崩溃!顺便说一下,我的观点不是关于Tornado与Django的比较,而是关于Django与Tornado结合使用的。http://www.tornadoweb.org/en/stable/wsgi.html - Alan Franzoni
"tornado.ioloop.IOLoop.instance().start()这段代码是什么意思?" - user571102
显示剩余2条评论

6

更新:

我创建了一个最小化的演示,展示了如何使用Tornado Web服务器与Django良好地运行:

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

原始帖子:

只是一个备注:从1.6到1.7,WSGI应用程序工作流程已更改。您必须替换导入项。

import django.core.handlers.wsgi

使用

from django.core.wsgi import get_wsgi_application

并且将应用程序初始化更改为

application = django.core.handlers.wsgi.WSGIHandler()

to

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()

4
有一个名为 tornado-proxy 的项目可以帮助你。但是我想推荐你使用 Nginx。在 Nginx 配置中,你可以使用 proxy_pass 来进行如下调用:
location /comet {
  proxy_pass http://localhost:8081;
}

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

23
Django 不是一个网站服务器。它内置了一个基础的网站服务器来协助开发 Django 项目,但该服务器不适合用于生产环境。 - Ignacio Vazquez-Abrams
1
完全正确,尽管我假设xRobot正在使用Django(带有其Web服务器)作为构建其Web项目的完整Web服务器/框架。我没有向他提供细节。 - MyGGaN
我已经在我的电脑上尝试了聊天和Tornado,它完美地运行着。 在我的服务器上,我正在使用nginx和django框架,但我不知道应该把Tornado放在哪里。 顺便说一句,你也尝试过Nginx的Push模块吗? 谢谢 ;) - xRobot
抱歉,我没有。但是你说的“放龙卷风”是什么意思?我的龙卷风源代码在项目的子文件夹中,然后我用以下命令启动它: sudo nginx -c conf/nginx.conf - MyGGaN
啊,好的...我会将Tornado源代码插入到一个子文件夹中。谢谢 ^_^ - xRobot

2

在现实世界中,您需要使用WSGI将Django与某些生产就绪的Web服务器连接起来。这个演示展示了如何从一个Python模块运行Tornado(和它的Web服务器)和Django并行服务不同的URL前缀:https://github.com/bdarnell/django-tornado-demo。 但是,Tornado会在提供任何针对Django的请求时阻塞。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接