2016-03-09 19 views
7

Używam Django 1.9.3. Mam projekt z kilkoma aplikacjami. Chciałbym zaktualizować tabele jednej z aplikacji podczas uruchamiania projektu.Django - kod wykonania przy uruchomieniu

Use-case:

Na przykład, powiedzmy, że chcemy sprzedawać przedmioty na mojej stronie internetowej. Mam aplikację, która zawiera model Przedmiot. Mam serwis internetowy poza Django, który zapewnia usługę "give_all_items_available()". Chcę przekazać mojemu użytkownikowi listę przedmiotów za pomocą strony internetowej. Wydaje mi się, że muszę aktualizować moją bazę danych regularnie (przy uruchomieniu i co jakiś czas) za pomocą danych wejściowych do usługi sieciowej.

mam cały kod napisany, wygląda następująco (jest to przykład):

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 ;-) 

Moim problemem jest to, że nie wiem gdzie napisać ten kod

Strzały:

Do tej pory z Django 1.6.5 otrzymałem kod z pliku init .py mojej aplikacji. To działało, ale pomyślałem, że to było dość brzydkie (rozpoczęcie wątku z "importem" wygląda naprawdę jak ukryty kod).

Widziałem w Django 1.9 metodę "ready()". Ale jest napisane w dokumentacji, aby nie zajmować się modelami w tej metodzie, więc jestem zdezorientowany.

Mogę dodać kod startowy do polecenia uruchamiania mojego serwera, ale ten kod startowy jest zorientowany na aplikacje i moim zdaniem projekty nie mają z tym nic wspólnego.

Co byś polecił?

Chętnie udzielę więcej informacji w razie potrzeby.

Dzięki z góry,

+1

Być może znajdziesz coś przydatnego w [tym pytaniu o stackoverflow] (http://stackoverflow.com/questions/2781383/where-to-put-django-startup-code). – Robin

+0

Już to widziałem, zaakceptowana odpowiedź tego linku wymienia metodę "ready()" tak jak ja. Ale zgodnie z dokumentem Django, błędną praktyką jest interraktowanie z modelami w tej metodzie ... –

+3

Co oznacza "startup" w tym przypadku? Zwykle uruchamiasz witrynę raz, a następnie działa ona nieprzerwanie. Dlaczego trzeba wypełniać tabele przy "uruchomieniu", a nie np. W migracji? –

Odpowiedz

1

Dlaczego nie używasz Celery zamiast? Wiem, że pytasz o to, jak wypełnić tabelę przedmiotów podczas uruchamiania, ale ... Myślę, że zaplanowane zadanie selekcji tutaj pasuje i rozwiązuje w naturalny sposób twój problem.

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podaj link do odniesienia. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/11771232) –

+0

@MikeC, doceniam twój komentarz, ale zasadnicza część odpowiedzi zawiera: "zaplanowane zadanie", dodałem również nazwę jednego z narzędzie, które możemy wykorzystać do rozwiązania: Seler, link jest po prostu skrótem do tego narzędzia. – trinchet

+1

Dobrze Seler może być opcją, ale myślę, że Django zapewnia już sposoby robienia tego, czego potrzebowałem, bez konieczności uzależniania się od selera. Rzeczywiście, w dniu, w którym użyję Celery, by ulepszyć mój program, wtedy pomyślę o tym, ale nie chcę być uzależniony od selera tylko w tym celu. Potrzebuję zarządzania, myślę, jak na razie działa –

Powiązane problemy