Sto usando Django 1.9.3. Ho un progetto con diverse app. Vorrei aggiornare le tabelle di una delle app all'avvio del progetto.Django - Esegui codice all'avvio
caso d'uso:
Per esempio, diciamo che voglio vendere oggetti sul mio sito. Ho un'app che contiene il modello Item. Ho un servizio web al di fuori di Django che fornisce il servizio "give_all_items_available()". Voglio fornire al mio utente l'elenco degli articoli che utilizzano il sito web. Quindi penso di dover aggiornare regolarmente il mio database (all'avvio e di tanto in tanto) con quell'input del servizio web.
Ho tutto il codice scritto, sembra che il seguente (è un esempio):
from my_app.models import My_table
def on_startup():
my_thread = Thread(execute = populate_tables, loopmode = True, background = True) # thread running in loopmode in background
my_thread.start() # starts the thread and returns
def populate_tables()
response = call_webservice() # let's imagine this method returns data for creating a new model instance
My_table(response).save() # this save() isn't threadsafe in this example, but that's not my point ;-)
Il mio problema è che non so dove scrivere questo codice
Tentativi:
Finora, con Django 1.6.5, sono arrivato con un codice dal file init .py della mia app. Stava funzionando, ma ho pensato che fosse abbastanza brutto (iniziare una discussione con un "import" sembra davvero un codice nascosto).
Ho visto in Django 1.9 il metodo "ready()". Ma è scritto nella documentazione di non trattare con i modelli in questo metodo, quindi sono confuso.
Potrei aggiungere il codice di avvio nel comando che avvia il mio server ma questo codice di avvio è orientato all'app e secondo me i progetti non hanno nulla a che fare con esso.
Cosa raccomanderesti?
Sarei felice di fornire ulteriori informazioni se necessario.
Grazie in anticipo,
È possibile trovare qualcosa di utile in [questa domanda StackOverflow] (http://stackoverflow.com/questions/2781383/where-to-put-django-startup-code). – Robin
L'ho già visto, la risposta accettata di questo link menziona il metodo "ready()" come faccio io. Ma secondo Django doc, è una cattiva pratica quella di interagire con i modelli in questo metodo ... –
Cosa significa "avvio" in questo caso? Solitamente si avvia un sito Web una volta e quindi viene eseguito continuamente. Perché è necessario popolare le tabelle in "avvio", piuttosto che ad es. In una migrazione? –