2010-12-12 17 views
2

Ich würde die call_method des django in einem Thread ausführen. Diese ist der Beispielcode:Problem mit django call_command in einem 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-Server ordnungsgemäß gestartet wird, aber ServerStarter wird zweimal erstellt.
Und beide ServerStarter Instanzen laufen.
Wenn ich call_command ("runserver", noreload = True) in der run-Methode kommentieren, dann wird nur
ein Thread erstellt (und das ist was ich will).
Vielen Dank im Voraus!

+0

Seien Sie sich bewusst, dass das nicht eine sehr nette Art und Weise ist, es zu tun; Was ist, wenn Port 8000 belegt ist? Oder was, wenn etwas anderes Port 8000 möchte? Verwenden Sie mindestens eine halb-zufällige Portnummer. –

+0

Das Gleiche passiert mit 'Multiprocessing' anstelle von' threading'. –

Antwort

0

Ich denke, dass dies wahrscheinlich durch den internen Django-Server verursacht wird, der alle Module neu lädt, wie es ist. Versuchen Sie, was auch immer das Äquivalent von --noreload ist für call_command (wahrscheinlich call_command("runserver", noreload=True), aber ich bin mir nicht sicher).

(auch QThread s gestartet werden durch QApplication.exec_();., Wenn Sie eine spezielle Anforderung haben es früher zu beginnen, ich glaube nicht, sollten Sie starter.start() selbst betreiben)

+0

Ich habe die GUI-Sachen von meiner Frage entfernt. – ApprenticePython

5

ich eine Lösung gefunden (Chris Morgan hatte Recht) . Dieser Code funktioniert wie ich will:

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()