【发布时间】:2011-02-01 20:08:03
【问题描述】:
如何将 Django 与 Tornado 网络服务器一起使用?
【问题讨论】:
标签: ajax django webserver comet tornado
如何将 Django 与 Tornado 网络服务器一起使用?
【问题讨论】:
标签: ajax django webserver comet tornado
非常简单(尤其是 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()
【讨论】:
更新:
我创建了一个最小的工作演示,展示了如何使用 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()
【讨论】:
有一个名为tornado-proxy 的项目可以帮助您。但我想建议你使用Nginx。在 Nginx 配置中,您现在可以使用 proxy_pass 来引导您的调用,如下所示:
location /comet {
proxy_pass http://localhost:8081;
}
location / {
proxy_pass http://localhost:8080;
}
【讨论】:
在现实世界中,您可以使用WSGI 连接 Django 和一些可用于生产的网络服务器。这个演示展示了如何从一个提供不同 URL 前缀的 python 模块并排运行 Tornado(和它的网络服务器)和 Django:https://github.com/bdarnell/django-tornado-demo。 不过,Tornado 会阻止处理任何指向 Django 的请求。
【讨论】: