2016-03-09 12 views
7

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,

+1

È possibile trovare qualcosa di utile in [questa domanda StackOverflow] (http://stackoverflow.com/questions/2781383/where-to-put-django-startup-code). – Robin

+0

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 ... –

+3

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? –

risposta

1

Perché non si utilizza Celery invece? So che stai chiedendo come compilare la tabella degli articoli all'avvio, ma ... Penso che un compito di sedici programmato qui si adatti e risolva in modo naturale il tuo problema.

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/11771232) –

+0

@MikeC, apprezzo il tuo commento, ma la parte essenziale della risposta è inclusa: "un'attività pianificata", ho incluso anche il nome di uno di lo strumento che potremmo usare per risolvere: Celery, il collegamento è solo una scorciatoia per questo strumento. – trinchet

+1

poiche Celery potrebbe essere un'opzione, ma penso che Django offra già dei modi per fare ciò di cui avevo bisogno senza dover dipendere dal sedano. Infatti, il giorno in cui userò il Celery per migliorare il mio programma, allora ci penserò su questo, ma non voglio essere dipendente da Celery solo per quello. La cosa di gestione è ciò di cui ho bisogno, penso, finora funziona –