Django is a great Web Framework which complements the Python programming language. Having switched to Python development few months ago I was on the lookout for a MVC like Web Framework that emphasizes Convention over Configuration (CoC), Rapid Development Principle of Don’t Repeat Yourself (DRY), Separation of concerns has Python as the underlying core language. And lo and behold Django proved to be that beast.
What is Django
Django is a MVT (model-view-template) framework build on the Python language. The MVT is identical to MVC (model-view-controller) but where in the common MVC pattern the view here is the template and controller the view. They both perform the same function separating the business logic from the presentation from the data layer (model). However Django does goes one step further and provides a view/template without native core language polluting the HTML.
Django emphasizes Reusability and “Pluggability” of components, Rapid Development, and the Principle of DRY (Don’t Repeat Yourself). Stuff you hear a lot with Ruby on Rails – another great web framework built on a solid language, Ruby.
Ok, enough of my rambling about how great this framework is. If you want to read more about it I recommend the following 2 links:
- djangoproject.com – main Django site and
- djangobook.com – a step by step how to build everything from templates to internationalized sites.
The LAMP stack
Ok so everyone is talking about a LAMP stack and everyone wants to run their site on a LAMP stack. Why not when you can tap into great open source tools for free. The word LAMP is a bit over emphasised since most sites today run on a custom configured implementation using best of breed open source software.
“LAMP is an acronym for a solution stack of free, open source software, referring to the first letters of Linux (operating system), Apache HTTP Server, MySQL (database software) and PHP (or sometimes Perl or Python), principal components to build a viable general purpose web server” ~ Wikipedia
Few years ago when open source software was limited, LAMP had typically meant Linux, Apache, MySQL and PHP. Today Linux can take many flavours from CentOS, Red Hat or the popular Debian-derived Linux distribution Ubuntu. The web server Apache can be replaced with a super fast & lighter HTTP and reverse proxy server called nginx. MySQL, post Oracle acquisition is often replaced with PostgreSQL or a NoSQL version called MongoDB. And PHP by cleaner & concise languages like Python or Ruby.
In this post I will cover how to setup a LAMP stack where:
- Linux = Ubuntu 11.10. This can also work with 10.xx version of Ubuntu.
- Apache = we will leave it as is since it is still a great web server but hook in mod_wsgi – a Python WSGI adapter module for Apache. WSGI is nothing more than an interface specification by which server and application communicate. In this case with Python.
- MySQL = will stay with MySQL but you can also install MongoDB.
- PHP = will be replaced with Python and drop in the Django MVT framework.
Ok let’s get started.
How to Setup Django on Ubuntu
The following assumes you have already installed Ubuntu and LAMP. If not head over to my prior posts on how to:
Installing pre-req components
1. Standard procedure is to always run update on your Ubuntu installation.
sudo apt-get update
2. Install mod_wsgi on Apache
sudo apt-get install libapache2-mod-wsgi
3. Install Python setup tools with pip. pip installs packages. Python packages. An easy_install replacement.
sudo apt-get install python-setuptools sudo apt-get install python-pip
4. Install Django MVT framework using pip.
sudo pip install Django
Now that’s done. Easy hey. Now let’s configure your 1st Django site.
Assuming your site will be called “purpleblue.com”
Configuring your 1st Django site
5. Recall from the LAMP setup that we were storing all web sites in /var/www/ folder. For example purposes, I will use purpleblue_com as my Django project. Notice the use of django-admin.py to create the Django site and the use of underscores vs decimal point. Only numbers, letters and underscores are allowed in the Django project name.
cd /var/www/ sudo django-admin.py startproject purpleblue_com
5.1 Verify new project by typing this in and hitting enter. ls lists the contents of a directory showing all files inc hidden ones, hence the -all option.
ls –all
If you see purpleblue_com listed, then change directory to it.
cd purpleblue_com
and verify you can see 4 .py files – init, manage, settings & urls. Those are Django new project default install files.
6. Now we create a wsgi file for the site so apache knows how to run this site.
sudo mkdir /var/www/purpleblue_com/apache sudo nano /var/www/purpleblue_com/apache/django.wsgi
… and add this into django.wsgi
import os import sys path = '/var/www/purpleblue_com' if path not in sys.path: sys.path.insert(0, '/var/www/purpleblue_com') os.environ['DJANGO_SETTINGS_MODULE'] = 'purpleblue_com.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
TIP: It’s always a good idea to specify the actual application module.
6. Using webmin (ref our LAMP install) setup new apache site for this project.
6.1 Go to: https://YOUR_DEV_VM_IP:10000/
6.2 Servers > Apache Webserver > Create virtual host
6.3 Configure your new host
Document Root = /var/www/purpleblue_com/
Server Name = purpleblue.com
6.4 Click on “Create Now” button. And go back into the settings by clicking on “Virtual Server” button next to your new host.
6.4 Click on “Edit Directives” and paste the following in:
ServerName purpleblue.com DocumentRoot /var/www/purpleblue_com <Directory /var/www/purpleblue_com> Order allow,deny Allow from all </Directory> WSGIDaemonProcess purpleblue_com processes=2 threads=15 display-name=%{GROUP} WSGIProcessGroup purpleblue_com WSGIScriptAlias / /var/www/purpleblue_com/apache/django.wsgi
The last 3 lines above allow this Django site to run in daemon mode.
TIP: When you make any .py changes in your Django site, rather then restarting/refreshing apache you can touch this wsgi and the changes will be picked up.
sudo touch /var/www/purpleblue_com/apache/django.wsgi
7. Restart apache to take new site & settings into effect.
sudo /etc/init.d/apache2 restart
8. Add the new domain purpleblue.com to your primary OS host file pointing to your VM where the Django project purpleblue_com resides.
9. Test your new project by going to the Server Name (http://purpleblue.com) you just setup. You should see a similar default Django installation page:
It worked! Congratulations on your first Django-powered page.
If you get an error or cannot see the default Django installation page make sure you check out apache log file. Common approach is to grab the tail end of the apache error log file to see what just happened.
tail /var/log/apache2/error.log
Bonus – Django CMS
If you have the time also check out Django CMS that is built on top of the Django Web Framework.
Django CMS site: https://www.django-cms.org/
Happy Django exploring & Python coding!
References
- Modwsgi – Integration With Django: http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango
- Configuration problems with django and mod_wsgi: http://stackoverflow.com/questions/2587251/configuration-problems- with-django-and-mod-wsgi