2010-12-12 2 views
2

스레드 내에서 장고의 call_method를 실행하고 싶습니다. 이 샘플 코드입니다 :스레드 내의 django의 call_command에 문제가 있습니다.

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. 

장고 서버가 제대로 시작하지만 ServerStarter 두 번작성됩니다.
그리고 두 ServerStarter 인스턴스가 모두 실행됩니다.
run 메소드에서 call_command ("runserver", noreload = True)에 주석을 달면
하나의 스레드 만 생성됩니다.
미리 감사드립니다.

+0

아주 좋은 방법은 아닙니다. 포트 8000을 가져 가면 어떨까요? 또는 다른 것이 포트 8000을 원하면 어떻게 될까요? 최소한 세미 임의의 포트 번호를 사용하십시오. –

+0

'threading' 대신에'multiprocessing'을 사용하면 같은 일이 발생합니다. –

답변

0

아마도 이것은 장고 내부 서버가 모든 모듈을 다시로드 할 때 발생하는 것으로 생각됩니다. --noreload에 해당하는 항목이 call_command (아마도 call_command("runserver", noreload=True)이지만 확실하지는 않음)이라고 생각되면 시도해보십시오.

이 (또한 QThreadQApplication.exec_()에 의해 시작된다. 이전을 시작하는 특별한 요구 사항이없는 한, 당신이 starter.start() 직접 실행해야합니다 생각하지 않습니다) 나는 해결책을 발견

+0

내 질문에서 GUI 항목을 제거했습니다. – ApprenticePython

5

(크리스 모건은 옳았다) . 이 코드는 내가 원하는대로 작동합니다.

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() 
관련 문제