Where to put Django startup code? Where to put Django startup code? python python

Where to put Django startup code?


Write middleware that does this in __init__ and afterwards raise django.core.exceptions.MiddlewareNotUsed from the __init__, django will remove it for all requests :). __init__ is called at startup by the way, not at the first request, so it won't block your first user.

There is talk about adding a startup signal, but that won't be available soon (a major problem for example is when this signal should be sent)

Related Ticket: https://code.djangoproject.com/ticket/13024

Update: Django 1.7 includes support for this. (Documentation, as linked by the ticket)


If you were using Apache/mod_wsgi for both, use the WSGI script file described in:

http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

Add what you need after language translations are activated.

Thus:

import syssys.path.insert(0, '/usr/local/django/mysite')import settingsimport django.core.managementdjango.core.management.setup_environ(settings)utility = django.core.management.ManagementUtility()command = utility.fetch_command('runserver')command.validate()import django.confimport django.utilsdjango.utils.translation.activate(django.conf.settings.LANGUAGE_CODE)# Your line here.django.core.management.call_command('syncdb', interactive=False)import django.core.handlers.wsgiapplication = django.core.handlers.wsgi.WSGIHandler()


In Django 1.7+ if you want to run a startup code and,

1. Avoid running it in migrate, makemigrations, shell sessions, ...

2. Avoid running it twice or more

A solution would be:

file: myapp/apps.py

from django.apps import AppConfigdef startup():    # startup code goes hereclass MyAppConfig(AppConfig):    name = 'myapp'    verbose_name = "My Application"    def ready(self):        import os        if os.environ.get('RUN_MAIN'):            startup()

file: myapp/__init__.py

default_app_config = 'myapp.apps.MyAppConfig'

This post is using suggestions from @Pykler and @bdoering