Problème avec call_command de django dans un fil
-
08-10-2019 - |
Question
Je voudrais d'exécuter le call_method du django dans un fil. Ceci est l'exemple de code:
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.
serveur Django démarre correctement, mais ServerStarter est créé deux fois .
Et les instances des deux ServerStarter courent.
Si je call_command commentaire ( « runserver », noreload = Vrai) dans la méthode d'exécution, seul
un thread est créé (et qui est ce que je veux).
Merci à l'avance!
La solution
Je pense que cela est probablement causé par le serveur interne Django rechargeant tous les modules comme à son habitude. Essayez quel que soit l'équivalent de --noreload
est pour call_command
(probablement call_command("runserver", noreload=True)
mais je ne suis pas sûr).
(également QThread
s sont mis en marche par QApplication.exec_()
,., Sauf si vous avez un besoin particulier de commencer plus tôt, je ne crois pas que vous devez exécuter starter.start()
vous)
Autres conseils
J'ai trouvé une solution (Chris Morgan avait raison). Ce code fonctionne comme je veux:
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()