Как правильно обслуживать приложение Django через веб-сервер Twisted? - PullRequest
0 голосов
/ 06 мая 2020

Я создаю систему, в которой некоторые компоненты будут запускаться в собственном процессе или потоке. Им нужно общаться друг с другом. Одним из этих компонентов является приложение Django, внутренняя связь с приложением Django не будет осуществляться через HTTP. В поисках сетевых библиотек я нашел Twisted (потрясающая библиотека!). Прочитав ее документацию, я обнаружил, что Twisted также реализует спецификацию WSGI , поэтому я подумал, что его веб-сервер может обслуживать такие приложения WSGI, как Django. Следуя документации, я использую следующий скрипт для обслуживания приложения Django:

from twisted.web import server
from twisted.internet import reactor, endpoints
from twisted.web.wsgi import WSGIResource
from twisted.python.threadpool import ThreadPool
from mysite.wsgi import application as django_application

# Create and start a thread pool to handle incoming HTTP requests
djangoweb_threadpool = ThreadPool()
djangoweb_threadpool.start()
# Cleanup the threads when Twisted stops
reactor.addSystemEventTrigger('after', 'shutdown', djangoweb_threadpool.stop)

# Setup a twisted Service that will run the Django web app
djangoweb_request_handler = server.Site(WSGIResource(reactor, djangoweb_threadpool, django_application))
djangoweb_server = endpoints.TCP4ServerEndpoint(reactor, 8000)
djangoweb_server.listen(djangoweb_request_handler)

reactor.run()

Сохраните его в файле типа runserver.py в том же каталоге manage.py, вы можете запустить сервер WSGI запустив python runserver.py.
Я создал представление django, которое выполняет блокирующий вызов time.sleep() для проверки, оно работает нормально. Поскольку он многопоточен, он не блокирует другие запросы. Так что я думаю, что он хорошо работает с синхронным кодом Django. Я мог бы настроить другую службу с индивидуальным протоколом в качестве шлюза для внутренней связи.
1) Правильно ли этот сценарий загружает приложение Django? Он будет работать так же, как и другие серверы WSGI, такие как gunicorn и uwsgi?
2) Будут ли эти потоки выполняться параллельно?

1 Ответ

0 голосов
/ 19 мая 2020

hendrix - это проект, который позволяет запускать django через twisted. Похоже, что при желании он может запускать другие скрученные службы (https://hendrix.readthedocs.io/en/latest/deploying-other-services/).

Если вы находитесь на ранних стадиях разработки, подумайте о klein . Это больше похоже на flask, чем на django.

...