Pregunta

lo haría para ejecutar call_method del django el interior de un hilo. Este es el código de ejemplo:

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.

servidor de Django se inicia correctamente, pero ServerStarter se crea dos veces .
Y los casos de ambos ServerStarter corren.
Si comento call_command ( "ejecución del servidor", noreload = true) en el método de ejecución, entonces sólo
se crea un hilo (y eso es lo que quiero).
Gracias de antemano!

¿Fue útil?

Solución

Creo que esto es probablemente causado por el servidor interno de Django volver a cargar todos los módulos como es su costumbre. Pruebe cualquiera que sea el equivalente de --noreload es para call_command (probablemente call_command("runserver", noreload=True) pero no estoy seguro).

(también QThreads son iniciadas por QApplication.exec_();. A menos que tenga un requisito especial para iniciarlo antes, no creo que se debe ejecutar starter.start() mismo)

Otros consejos

He encontrado una solución (Chris Morgan tenía razón). Este código funciona como yo quiero:

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()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top