如何结合Django和Gevent进行基础开发?

19
在经过大量搜索和谷歌后,我回到了起点。我有Django 1.4,并正在寻找一个体面的工作示例来弄清楚如何让Django与gevent一起工作。我喜欢Django框架,但我需要它处理长轮询。我已经有一个使用单独的gevent处理长轮询请求以及通过http进行图像流传输的工作服务器,帧速率约为10帧/秒。我想使用Django中的所有好东西来提供这部分的框架。
有很多例子,但不幸的是,这些例子都不能直接使用!有一个工作示例可以帮助理解这两个东西如何一起工作。
以下是我迄今为止发现的问题: http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/ 问题:ImportError: Could not import settings 'webchat.settings' (Is it on sys.path?): No module named webchat.settings

https://github.com/codysoyland/django-socketio-example/blob/master/README.rst 问题:安装时出现权限问题,获取gevent失败。 尝试从git hub手动获取。示例运行,但浏览器连接时会生成这些错误。

这些信息很有用,但并未提供基本答案。 需要帮助理解Python中的Comet(带Django) https://bitbucket.org/denis/gevent/src/tip/examples/webchat/chat/views.py http://blog.gevent.org/2009/10/10/simpler-long-polling-with-django-and-gevent/

我希望有人能够解释(拜托了,非常拜托)的是: 我使用 Django 1.4 创建了一个基本网站 - 这里的教程 https://docs.djangoproject.com/en/1.4/intro/tutorial01/ 很好。 现在我需要理解如何修改以使用 gevent 并能够处理异步事件。我相信这并不难 - 我只需要找一个懂它的人来解释该做什么,以及像 monkey_patch 这样的事情正在发生什么。
谢谢。
1个回答

24

以下是我如何使用gevent和猴子补丁运行Django的方法:

  1. 我修改了manage.py文件,使得第一行 (shebang之后) 为from gevent import monkey; monkey.patch_all()

  2. 我添加了一个新的run_production_server脚本(见下文)。

最后,我将前端web服务器配置为代理请求到端口1234(这是run_production_server正在侦听的端口)。

from gevent import monkey; monkey.patch_all()
from gevent.wsgi import WSGIServer

from django.core.management import setup_environ    
import settings
setup_environ(settings)

from django.core.handlers.wsgi import WSGIHandler as DjangoWSGIApp
application = DjangoWSGIApp()
server = WSGIServer(("127.0.0.1", 1234), application)
print "Starting server on http://127.0.0.1:1234"
server.serve_forever()

有些人可能会抱怨这个服务器不够“Web规模”。我怀疑他们是否能提供基准测试来证明这一点,但如果你担心的话,你也可以使用 gunicorn 或者 uwsgi 作为你的服务器。但这对我来说已经足够了。


谢谢你提供脚本,这非常有帮助。但是我已尝试使用,并认为我遗漏了某些步骤。我从默认的Django 1.4项目开始。我使用“%python manage.py runserver 0.0.0.0:8000”启动服务器。那么我该如何使用你提供的脚本呢? - Tereus Scott
抱歉问这样愚蠢的问题...我该如何在使用manage.py启动时运行此脚本?我现在正在查看django wsgi文档,它提到了wsgi.py - 这是您的脚本应该放置的位置吗? - Tereus Scott
当我运行上面的脚本时,我得到了这个错误:raise ImportError("无法导入设置,因为环境变量%s未定义。" % ENVIRONMENT_VARIABLE)所以我添加了这个:from django.conf import settings 现在我得到了这个错误:ImportError: 无法导入设置,因为环境变量DJANGO_SETTINGS_MODULE未定义。 - Tereus Scott
我已经用这个脚本的内容替换了wsgi.py,现在出现了这个错误:AttributeError: 'Settings'对象没有'file'属性。 - Tereus Scott
请确保您的数据库连接器支持在gevent内异步运行。例如,https://github.com/PyMySQL/mysqlclient-python不支持。 - Rune Kaagaard
显示剩余2条评论

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