Login

cron/console bootstrap django

Author:
nstrite
Posted:
August 19, 2007
Language:
Python
Version:
.96
Tags:
django console cron bootstrap
Score:
6 (after 8 ratings)

Call this function as the first thing in your cron, or console script; it will bootstrap Django, and allow you to access all of the Django modules from the console, with out using 'python manage.py shell'

Examples:

    # A script within your django project.
    from django_bootstrap import bootstrap
    bootstrap(__file__)

--- or ---

    # A cron script located outside of your django project
    from django_bootstrap import bootstrap
    bootstrap("/path/to/your/project/root/")
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import os
import sys

def bootstrap(path):
    """
    Call this function as the first thing in your cron, or console script; it will bootstrap Django, and allow you to access all of the Django modules from the console, without using 'python manage.py shell'

    Examples:
 
        # A script within your django project.
        from django_bootstrap import bootstrap
        bootstrap(__file__) 
    
    --- or ---
    
        # A cron script located outside of your django project
        from django_bootstrap import bootstrap
        bootstrap("/path/to/your/project/root/")
    """
    path = find_settings_path(path)
    parent_path = os.path.abspath(os.path.join(path, '..'))
    
    # Include path to settings.py directory
    os.sys.path.append(path)
    # Include path to django project directory
    os.sys.path.append(parent_path)
    
    from django.core import management
    try:
        import settings # Assumed to be in the os path
    except ImportError:
        sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
        sys.exit(1)
        
    management.setup_environ(settings)

def find_settings_path(path):
    """
    Retrieve the path of the settings.py module for a django project. This can be passed into django_utils.bootstrap). You can pass in the  __file__ variable, or an absolute path, and it will find the closest settings.py module.
    """
    if os.path.isfile(path):
        path = os.path.dirname(path)
    
    path = os.path.abspath(path)
    parent_path = os.path.abspath(os.path.join(path, '..'))
    settings_path = os.path.join(path, 'settings.py')

    if os.path.exists(settings_path):
        return path
    elif path != parent_path:
        return find_settings_path(parent_path)
    else:
        raise Exception('Could not find settings path.')

More like this

  1. script for run a django task by tailorcai 8 years, 1 month ago
  2. set_paths by amitu 6 years, 8 months ago
  3. djangopath: conveniently set sys.path and DJANGO_SETTINGS_MODULE by alia_khouri 6 years, 11 months ago
  4. Command Line Script Launcher by dakrauth 6 years, 11 months ago
  5. Simple Plone Migration by msm-art 7 years, 5 months ago

Comments

buriy (on August 19, 2007):

if path is directory,

os.path.dirname(path)

is synonym for

os.path.abspath(os.path.join(path, '..'))

#

Magus (on August 20, 2007):

I would personally remove line 24, as you're generally not supposed to have the project dir itself on pythonpath, and it could screw up imports.

#

nstrite (on August 21, 2007):

line 24 allows line 30 to work. unless we know the name of your project ahead of time, you need to have the settings.py file in your path (import settings) otherwise you would need from xyz import settings.

#

guettli (on September 6, 2007):

Thank you for this snippet. That was what I was looking for:

from django.core import management management.setup_environ(settings)

#

Please login first before commenting.