with tutorial pelicula learning how descargar con aplicaciones python django

python - tutorial - ¿Ejecutar código cuando Django solo se inicia UNA VEZ?



django windows (7)

Actualización: Django 1.7 ahora tiene un gancho para esto

archivo: myapp/apps.py

from django.apps import AppConfig class MyAppConfig(AppConfig): name = ''myapp'' verbose_name = "My Application" def ready(self): pass # startup code here

archivo: myapp/__init__.py

default_app_config = ''myapp.apps.MyAppConfig''

Para Django <1.7

La respuesta número uno ya no parece funcionar, urls.py se carga cuando se solicita por primera vez.

Lo que ha funcionado últimamente es poner el código de inicio en cualquiera de tus INSTALLED_APPS init .py eg myapp/__init__.py

def startup(): pass # load a big thing startup()

Cuando se usa ./manage.py runserver ... esto se ejecuta dos veces, pero eso se debe a que runserver tiene algunos trucos para validar los modelos primero, etc ... implementaciones normales o incluso cuando recargas automáticas de runserver, esto solo se ejecuta una vez.

Estoy escribiendo una clase Django Middleware que quiero ejecutar solo una vez al inicio, para inicializar algún otro código arbritary. He seguido la muy buena solución publicada por sdolan here , pero el mensaje "Hola" se envía a la terminal dos veces . P.ej

from django.core.exceptions import MiddlewareNotUsed from django.conf import settings class StartupMiddleware(object): def __init__(self): print "Hello world" raise MiddlewareNotUsed(''Startup complete'')

y en mi archivo de configuración de Django, tengo la clase incluida en la lista MIDDLEWARE_CLASSES .

Pero cuando ejecuto Django usando runserver y solicito una página, me meto en la terminal

Django version 1.3, using settings ''config.server'' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C. Hello world [22/Jul/2011 15:54:36] "GET / HTTP/1.1" 200 698 Hello world [22/Jul/2011 15:54:36] "GET /static/css/base.css HTTP/1.1" 200 0

¿Alguna idea de por qué "Hola mundo" se imprime dos veces? Gracias.


Actualice la respuesta de Pykler a continuación: Django 1.7 ahora tiene un gancho para esto

No lo hagas de esta manera.

No quiere "middleware" para una cosa de inicio de una sola vez.

Desea ejecutar código en el urls.py nivel urls.py . Ese módulo se importa y ejecuta una vez.

urls.py

from django.confs.urls.defaults import * from my_app import one_time_startup urlpatterns = ... one_time_startup()


Esta pregunta está bien respondida en el gancho Punto de entrada de blog para proyectos de Django , que funcionará para Django> = 1.4.

Básicamente, puede usar <project>/wsgi.py para hacer eso, y se ejecutará solo una vez, cuando se inicie el servidor, pero no cuando ejecuta comandos o importa un módulo en particular.

import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings") # Run startup code! .... from django.core.wsgi import get_wsgi_application application = get_wsgi_application()


Según lo sugerido por @Pykler, en Django 1.7+ debe usar el gancho explicado en su respuesta, pero si desea que su función se invoque solo cuando se llame al servidor de ejecución (y no cuando se realizan migraciones, se llama a migrar, shell, etc. ), y desea evitar las excepciones de AppRegistryNotReady que debe hacer de la siguiente manera:

archivo: myapp/apps.py

import sys from django.apps import AppConfig class MyAppConfig(AppConfig): name = ''myapp'' verbose_name = ''My Application'' def ready(self): if ''runserver'' not in sys.argv: return True # you must import your modules here # to avoid AppRegistryNotReady exception from .models import MyModel # startup code here


Si ayuda a alguien, además de Pykler respuesta de Pykler, la opción "--noreload" evita que runserver ejecute el comando al inicio dos veces:

python manage.py runserver --noreload

Pero ese comando no volverá a cargar runserver después de los cambios de otros códigos también.


Tenga en cuenta que no se puede conectar con fiabilidad a la base de datos o interactuar con modelos dentro de la función AppConfig.ready (consulte la advertencia en los documentos).

Si necesita interactuar con la base de datos en su código de inicio, una posibilidad es usar la señal de connection_created para ejecutar el código de inicialización al conectarse a la base de datos.

from django.dispatch import receiver from django.db.backends.signals import connection_created @receiver(connection_created) def my_receiver(connection, **kwargs): with connection.cursor() as cursor: # do something to the database

Obviamente, esta solución es para ejecutar código una vez por conexión a la base de datos, no una vez por cada inicio del proyecto. Por lo tanto, querrá un valor razonable para la configuración CONN_MAX_AGE , por lo que no volverá a ejecutar el código de inicialización en cada solicitud. También tenga en cuenta que el servidor de desarrollo ignora CONN_MAX_AGE , por lo que ejecutará el código una vez por solicitud en desarrollo.

El 99% de las veces esta es una mala idea: el código de inicialización de la base de datos debe incluirse en las migraciones, pero hay algunos casos de uso en los que no se puede evitar la inicialización tardía y las advertencias anteriores son aceptables.


si desea imprimir "hello world" una vez cuando ejecuta el servidor, ponga print ("hello world") fuera de clase StartupMiddleware

from django.core.exceptions import MiddlewareNotUsed from django.conf import settings class StartupMiddleware(object): def __init__(self): #print "Hello world" raise MiddlewareNotUsed(''Startup complete'') print "Hello world"