как совместить django плюс gevent основы?

После долгих поисков и гугления я возвращаюсь к колодцу. У меня есть Django 1.4, и я ищу достойный работающий пример, чтобы понять, как заставить Django работать с gevent. Мне нравится фреймворк Django, но мне нужно, чтобы он обрабатывал длинные опросы. У меня уже есть работающий сервер, использующий gevent сам по себе, который обрабатывает длинные запросы на опрос, а также выполняет потоковую передачу изображений через http со скоростью около 10 кадров в секунду. Я хотел бы использовать все возможности Django, чтобы обеспечить основу для этой части.

Есть много примеров, но, к сожалению, ни один из них не работает из коробки! Было бы очень полезно иметь рабочий пример, чтобы понять, как эти две вещи работают вместе.

Вот что я нашел до сих пор и проблемы:

http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/ проблема: ImportError: Не удалось импортировать настройки 'webchat.settings' (находится ли он в sys.path?): Нет модуля с именем webchat .настройки

https://github.com/codysoyland/django-socketio-example/blob/master/README.rst Проблема: установка завершается сбоем из-за проблем с правами доступа при получении gevent Пробовал вручную получить его из git hub. Пример запускается, но генерирует эти ошибки при подключении браузеров.

Они информативны, но не дают основного ответа. Нужна помощь в понимании Comet в Python (с 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).

Спасибо.


person Tereus Scott    schedule 09.06.2012    source источник


Ответы (1)


Вот как я запускаю Django с исправлением gevent + monkey:

  1. Я изменил manage.py, поэтому первая строка (после шебанга) будет from gevent import monkey; monkey.patch_all()

  2. Я добавил новый скрипт run_production_server (см. ниже).

Наконец, я настроил свой интерфейсный веб-сервер на прокси-запросы к порту 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()

Некоторые могут пожаловаться, что этот сервер недостаточно «веб-масштабируется». Я сомневаюсь, что они смогут предоставить тесты, чтобы доказать это, но если вы беспокоитесь, вы также можете использовать gunicorn или uwsgi для своего сервера. Но это работает просто отлично для меня.

person David Wolever    schedule 12.06.2012
comment
Спасибо за скрипт, очень помог. Но я пробовал это, и я думаю, что что-то упускаю. Я начинаю с проекта django 1.4 по умолчанию. Я запускаю сервер с %python manage.py runserver 0.0.0.0:8000. Как использовать предоставленный вами скрипт? - person Tereus Scott; 13.06.2012
comment
В какой части его использования вы не уверены? - person David Wolever; 13.06.2012
comment
Извините, что задаю глупые вопросы.... как мне заставить этот скрипт запускаться, когда я запускаю вещи с помощью manage.py? Я смотрю документы django wsgi прямо сейчас, и в них упоминается wsgi.py — это то, куда должен идти ваш скрипт? - person Tereus Scott; 13.06.2012
comment
Когда я запускаю приведенный выше скрипт, я получаю это повышение ImportError (Настройки не могут быть импортированы, потому что переменная среды %s не определена. % ENVIRONMENT_VARIABLE). Поэтому я добавил это: из настроек импорта django.conf Теперь я получаю это: ImportError: настройки не могут быть импортированы , потому что переменная среды DJANGO_SETTINGS_MODULE не определена. - person Tereus Scott; 13.06.2012
comment
Я не заменил wsgi.py содержимым этого скрипта, и теперь я получаю это: AttributeError: объект «Настройки» не имеет атрибута «file» - person Tereus Scott; 13.06.2012
comment
О, подождите, я мог перепутать порядок импорта. Я отредактировал свой ответ, попробуйте. Поместите его в файл, затем запустите. Он запустит HTTP-сервер, прослушивающий порт 1234. - person David Wolever; 13.06.2012
comment
Убедитесь, что ваш коннектор базы данных поддерживает асинхронный запуск внутри gevent. Например, github.com/PyMySQL/mysqlclient-python не работает. - person Rune Kaagaard; 15.03.2020