Проблема с django call_command внутри потока - PullRequest
2 голосов
/ 12 декабря 2010

Я бы хотел выполнить call_method для django внутри Thread. Это пример кода:

import sys
sys.path.append("/my/django/project/path/")
import threading
import time 


# Import my django project configuration settings
from django.core.management import setup_environ
from mydjangoprojectname import settings
setup_environ(settings)

from django.core.management import call_command

class ServerStarter(threading.Thread):
    def __init__(self):
        super(ServerStarter, self).__init__()
        print "ServerStarter instance created"

    def run(self):
        print "Starting Django Server..."
        call_command("runserver", noreload=True)


if __name__ == '__main__':
    starter = ServerStarter()
    starter.start()

------------------------------
OutPut:
ServerStarter instance created
Starting Django Server...
ServerStarter instance created
Starting Django Server...
Validating models...
0 errors found
Django version 1.2.3, using settings 'mydjangoprojectname.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Сервер Django запускается правильно, но ServerStarter создается дважды .
И оба экземпляра ServerStarter запускаются.
Если я прокомментирую call_command ("runserver", noreload = True) в методе run, то только
один поток создан (и это то, что я хочу).
Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 12 декабря 2010

Я нашел решение (Крис Морган был прав). Этот код работает как я хочу:

import sys
sys.path.append("/my/django/project/path/")
import threading

# Import my django project configuration settings
from django.core.management import setup_environ, ManagementUtility

from mydjangoprojectname import settings
setup_environ(settings)


class ServerStarter(threading.Thread):
    def __init__(self):
        super(ServerStarter, self).__init__()
        print "ServerStarter instance created"

    def run(self):
        print "Starting Django Server..."
        utility = ManagementUtility()
        command = utility.fetch_command('runserver')
        command.execute(use_reloader=False)


if __name__ == '__main__':
    starter = ServerStarter()
    starter.start()
0 голосов
/ 12 декабря 2010

Я думаю, что это, вероятно, вызвано тем, что внутренний сервер Django перезагрузил все модули, как это обычно. Попробуйте любой эквивалент --noreload для call_command (вероятно, call_command("runserver", noreload=True), но я не уверен).

(Также QThread s запускаются QApplication.exec_(); если у вас нет особых требований, чтобы запустить его раньше, я не думаю, что вы должны запустить starter.start() самостоятельно.)

...