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!

Était-ce utile?

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 QThreads 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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top