Talk Funnel

Ramin Firoozye's Public Whisperings

Django bash shell shortcuts

1 comment (+)

SmileyChris had a post up recently on setting up bash aliases for Django. He uses the classic alias command which works for one-line shortcuts. I got inspired to put mine up too, but if you want to do something more elaborate, bash gives you this handy scripting language along with ‘shell commands’ so you can do something a bit more involved.

What I tried to do with these shortcuts was to create a set of mini-commands that quickly do what you need to do when developing Django. It might help someone out and squeeze an extra 2-3.5 microseconds each time you run a Django command. Hey, it all adds up.

In my case, I keep the directory for all my Django projects in a single ‘source’ directory so I can quickly jump in and out of them. The shell commands makes that assumption too. If your projects are all over the place, you’ll have to tweak things — but I’d suggest doing some housekeeping and moving everything to a common directory to help keep things neat and tidy.

To use these, copy the lines to the bottom of your ~/.bashrc or ~/.bash_profile. If you don’t see one of these in your home directory, remember that most *nix shells ignore files starting with a ‘.’ (period) so you’ll want to do something like:

% ls -al

To see all your files in the current directory. If you really don’t have one, then create a .bash_profile and put the following lines inside. You’ll want to customize the first four environment variables to point them to directories in your system. The ones there are samples, but once you set it up once, you’ll never have to worry about it again.

A minor caveat: These have been tested on a Mac OS-X Leopard. YM-will-most-likely-V. On with the code.

# Django shortcuts

# CHANGE: to directory where you installed Django sources.
DJANGOROOT=/dev/djangoproject
export DJANGOROOT

# CHANGE: to admin bin scripts directory under Django.
# This should work for the svn version.
DJANGOBIN=$DJANGOROOT/django/bin
export DJANGOBIN
PATH=$PATH:$DJANGOBIN:
export PATH

# CHANGE: to TCP port for testing.
# You go to http://localhost:8008 to hit the test sever.
DJANGOTESTPORT=8008
export DJANGOTESTPORT

# CHANGE: to base directory where you keep your Django projects.
DJANGOPROJECTBASE=~/Work/django
export DJANGOPROJCTBASE

# ---------------- Django shell commands ------------------

function django() {
  echo "dadmin - Basic django-admin"
  echo "dproj  - set up (show) default django project"
  echo "dsrc   - jump to Django projects home directory"
  echo "dls    - list current projects in Django projects home directory"
  echo "dcd    - jump to current project directory"
  echo "dstart - start a new project in the home directory"
  echo "dapp   - create a new application under the current project"
  echo "dsync  - Run syncdb and synchronize model with DBMS"
  echo "drun   - run current project in test server"
}

function dsrc() {
  cd $DJANGOPROJECTBASE;
}

function dls() {
  ls $DJANGOPROJECTBASE;
}

function dadmin() {
  python django-admin.py $*;
}

function dstart() {
  src;
  python django-admin.py startproject $*;
}

function dproj() {
  if [ $# -eq 0 ]
  then
    if [ $DJANGOCURRENTPROJECT ]
    then
      echo "Current project is: $DJANGOCURRENTPROJECT";
    else
      echo "Run 'dproj ' first";
    fi
  else
    if [ -d $DJANGOPROJECTBASE/$1 ]
    then
      DJANGOCURRENTPROJECT=$1;
      export DJANGOCURRENTPROJECT;
      DJANGO_SETTINGS_MODULE="$DJANGOPROJECTBASE/$DJANGOCURRENTPROJECT";
      export DJANGO_SETTINGS_MODULE;
      echo "Current project set to: $1";
    else
      echo "Project directory '$1' doesn't exist."
    fi
  fi
}

function dcheck() {
  if [ $DJANGOCURRENTPROJECT ]
  then
    cd $DJANGO_SETTINGS_MODULE;
    return 0;
  else
    echo "Run 'dproj ' first";
    return 1;
  fi
}

function dapp() {
  if [ dcheck ]
  then
    python manage.py startapp $*;
  fi
}

function dcd() {
  dcheck;
}

function dsync() {
  if [ dcheck ]
  then
    python manage.py syncdb;
  fi
}

function drun() {
  if [ dcheck ]
  then
    python manage.py runserver $DJANGOTESTPORT$*;
  fi
}


To get a reminder of how it all works, just type

% django

To see a list of current projects, use:

% dls

To start a new Django project, just go:

% dstart projectname

To set the current active project:

% dproj projectname

This checks to make sure the project exists under the base project directory. To quickly jump to the current project directory, you use:

% dcd

To create a new application under the current project use:

% dapp appname

Then you add the appname to your project’s settings.py file and you’re good to go. Once you’ve defined your model, run this to sync up the database and the model:

% dsync

And every time you want to run the test server for the current project, just run:

% drun

And assuming you didn’t change the DJANGOTESTPORT variable above, in the browser you go to:

http://localhost:8008/

or if localhost isn’t defined in your /etc/hosts file, you can also use:

http://127.0.0.1:8008

Under Windows, the easiest way to run this is to install Cygwin and then run bash from there.

Good luck.

Written by ramin

March 3rd, 2008 at 12:45 pm

Posted in Tech

Tagged with , ,

One Response to 'Django bash shell shortcuts'

Subscribe to comments with RSS

  1. Thanks for your post. I am new at python and this is a big help.

    Rosana Krinke

    6 Mar 10 at 2:34 pm

Leave a Reply