проект django с витой и запускаемой как "Демон" - PullRequest
1 голос
/ 15 февраля 2011

В последние два дня я пытаюсь найти способ запустить работающий проект django под Twisted.После детального поиска я нашел несколько способов его настройки.Но большинство из них посвящено тому, как запустить приложение через командную строку, а не как демон. Я хочу запустить проект django как демон.

Я попытался использовать следующие ссылки для реализации этого,

  1. Twisted: создание ThreadPool и последующее демонизация приводит к неинформативным зависаниям

  2. http://www.robgolding.com/blog/2011/02/05/django-on-twistd-web-wsgi-issue-workaround/

Но это также не работает для меня. Этот метод TCP-сервер даже не прослушивает данный порт.

Пожалуйста, помогите мне разобраться.

ОБНОВЛЕНИЕ

Извините за недостающую информацию. Вот мои цели.

Яновичок в витом мире, поэтому сначала я пытаюсь настроить мой рабочий проект django под витой, в настоящее время он хорошо работает на сервере тестирования django или apache через mod_wsgi.

Чтобы настроить его с витой, я использовал код привязки, приведенный ниже, этот код представляет собой комбинацию двух примеров, найденных в ссылках, которые я дал в первом посте.

Итак, чтобыИнтеграция приложения django с витой. Я использовал следующий код, имя файла: "server.py".

import sys
import os

from twisted.application import internet, service
from twisted.web import server, resource, wsgi, static
from twisted.python import threadpool
from twisted.internet import reactor
from django.conf import settings
import twresource # This file hold implementation of "Class Root".


class ThreadPoolService(service.Service):
    def __init__(self, pool):
        self.pool = pool

    def startService(self):
        service.Service.startService(self)
        self.pool.start()

    def stopService(self):
        service.Service.stopService(self)
        self.pool.stop()

class Root(resource.Resource):
    def __init__(self, wsgi_resource):
        resource.Resource.__init__(self)
        self.wsgi_resource = wsgi_resource

    def getChild(self, path, request):
        path0 = request.prepath.pop(0)
        request.postpath.insert(0, path0)
        return self.wsgi_resource

PORT = 8080

# Environment setup for your Django project files:
#insert it to first so our project will get first priority.
sys.path.insert(0,"django_project")
sys.path.insert(0,".")

os.environ['DJANGO_SETTINGS_MODULE'] = 'django_project.settings'
from django.core.handlers.wsgi import WSGIHandler

def wsgi_resource():
    pool = threadpool.ThreadPool()
    pool.start()
    # Allow Ctrl-C to get you out cleanly:
    reactor.addSystemEventTrigger('after', 'shutdown', pool.stop)
    wsgi_resource = wsgi.WSGIResource(reactor, pool, WSGIHandler())
    return wsgi_resource


# Twisted Application Framework setup:
application = service.Application('twisted-django')

# WSGI container for Django, combine it with twisted.web.Resource:
# XXX this is the only 'ugly' part: see the 'getChild' method in twresource.Root

wsgi_root = wsgi_resource()
root = Root(wsgi_root)

#multi = service.MultiService()
#pool = threadpool.ThreadPool()
#tps = ThreadPoolService(pool)
#tps.setServiceParent(multi)
#resource = wsgi.WSGIResource(reactor, tps.pool, WSGIHandler())
#root = twresource.Root(resource)


#Admin Site media files
#staticrsrc = static.File(os.path.join(os.path.abspath("."), "/usr/haridas/eclipse_workplace/skgargpms/django/contrib/admin/media/"))
#root.putChild("admin/media", staticrsrc)

# Serve it up:
main_site = server.Site(root)
#internet.TCPServer(PORT, main_site).setServiceParent(multi)
internet.TCPServer(PORT, main_site).setServiceParent(application)

#EOF.

Использование вышеприведенного кода. Он работал хорошо из командной строки, используя "twisted -ny server.py", но когдамы запускаем его как демон "twisted -y server.py", он зависает, но приложение прослушивает порт 8080. Я могу получить к нему доступ через telnet.

Я нашел некоторые исправления для этой проблемы с зависанием в самом стеке.Это помогло мне использовать приведенные ниже разделы кода, которые прокомментированы в приведенном выше файле server.py.

multi = service.MultiService()
pool = threadpool.ThreadPool()
tps = ThreadPoolService(pool)
tps.setServiceParent(multi)
resource = wsgi.WSGIResource(reactor, tps.pool, WSGIHandler())
root = twresource.Root(resource)

и: -

internet.TCPServer(PORT, main_site).setServiceParent(multi)

вместо использования: -

wsgi_root = wsgi_resource()
root = Root(wsgi_root)

и: -

internet.TCPServer(PORT, main_site).setServiceParent(application)

Модифицированный метод также не помог мне избежать проблемы с зависаниями. Есть ли кто-нибудь, кто успешно запускает приложения django в режиме витого демона?.

Я исправлял ошибки при объединении этих кодов? В настоящее время я только начал изучать витые архитектуры в деталях.Пожалуйста, помогите мне решить эту проблему

Спасибо и С уважением,

Харидас Н.

Примечание: - Я ищу файл конфигурации Twisted Application (TAC), в который интегрирован djangoприложение с витой и запустить без каких-либо проблем в режиме демона также.

Спасибо, Харидас Н.

1 Ответ

0 голосов
/ 15 февраля 2011

twistd - это Twisted Daemonizer .Все, что вы запускаете с twistd, будет легко демонизировать.Все, что вам нужно сделать, это , а не передать параметр --nodaemon.

Что касается того, почему ваш код «не работает», вам необходимо предоставить более подробную информацию о том, что вы сделали, чтоВы ожидали, что произойдет, и как то, что на самом деле произошло, отличается от ваших ожиданий.В противном случае, только маг может ответить на ваш вопрос.

Поскольку вы сказали, что порт TCP даже не настроен, единственное предположение, о котором я могу думать, это то, что вы пытаетесь прослушивать привилегированный порт (например, 80) без разрешения (т. е. вы не root и не используете authbind или что-то подобное).

...