Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django - execute code at start-up

Tags:

python

django

I am using Django 1.9.3. I have a project with several apps. I would like to update the tables of one of the app at the startup of the project.

Use-case:

For example, let's say I want to sell items on my website. I have an app which contains the model Item. I have a web-service outside Django which provide the service "give_all_items_available()". I want to provide to my user the list of items using the web-site. So I think I have to update my database regularly (at start-up and every once in a while) with that web-service input.

I have all the code written, it looks like the following (it's an example):

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

My problem is I don't know where to write this code

Attempts:

So far, with Django 1.6.5, I came with some code from the init.py file of my app. It was working, but I thought it was quite ugly (starting a thread with an "import" looks really like hidden code).

I saw in Django 1.9 the "ready()" method. But it's written in the documentation to not deal with models in this method so I am confused.

I could add the startup code in the command starting my server but this startup code is app oriented and in my opinion, the projects has nothing to do with it.

What would you recommend?

I'd be happy to provide more info if needed.

Thanks in advance,

like image 499
Julien Greard Avatar asked Mar 09 '16 07:03

Julien Greard


1 Answers

Why you don't use Celery instead? I know you are asking about how to populate your Item table on start-up, but... I think a scheduled celery task here fits and solves in a natural way your problem.

like image 59
trinchet Avatar answered Sep 22 '22 14:09

trinchet