Django

Django ist ein in Python geschriebenes Open Source Web-Framework, welches dem Model-View-Controller-Schema folgt. Dieses wird bei Django allerdings als Model-Template-View bezeichnet, das heißt ein Django view entspricht dem, was beim MVC Schema ein Controller ist. Es gibt sehr gute Dokumentation zu Django (siehe die Links am Ende dieser Seite), weshalb im Folgenden lediglich ein Schnellstart geschildert ist.

Installation

Die normale Installation unter Ubuntu-basierten Linuxversionen erfolgt mit

sudo aptitude install python-django ipython

Alternativ kann jedoch auch die aktuellste Version von der Projektwebseite heruntergeladen werden https://www.djangoproject.com/download/. Nach der Installation sollte diese getestet werden

$ ipython
In [1]: import django
In [2]: django.VERSION
Out[2]: (1, 0, 2, 'final', 0)

wobei der Output die jeweils installierte Version angibt, die natürlich nicht stets mit dem obigen Beispiel übereinstimmt. Zusätzlich muß das gewünschte Datenbankbackend installiert werden. Für MySQL ist das

sudo aptitude install python-mysqldb mysql-server

und für PostgreSQL

sudo aptitude install python-psycopg2 postgresql-8.3
Weitere Details zur Installation und Einrichtung der beiden Datenbanken findet sich in den betreffenden Abschnitten des Linux Administrationskurses: MySQL Datenbankserver und PostgreSQL Datenbankserver.

Erstellen eines Projekts

Eine Django Applikation gehört in der Regel zu einem Django Projekt, weshalb zuerst ein Projekt erstellt werden muss. Dazu sollte man vorerst ein Verzeichnis für sämtliche Projekte erstellen und danach darin ein neues Projekt erstellen. Im Folgenden wird ein System zur Verwaltung der Bücher einer kleinen Bibliothek als Projekt erstellt, weshalb das Projekt "library" getauft wird.

mkdir ~/django
cd ~/django
django-admin startproject library

Der Befehl django-admin startproject library hat das Verzeichnis library mit ein paar Dateien erstellt. Ab jetzt kann der mit Django mitgelieferte Entwicklungsserver getestet werden.

cd library
chmod u+x manage.py
./manage.py runserver

Der Server hört per Default nur auf Zugriffe auf das loopback Device des lokalen Computers auf Port 8000 (zum Testen einfach http://localhost:8000 in einem Webbrowser öffnen). Wird ein anderer Port benötigt oder soll auch auf andere IP Adressen des lokalen Computers gelauscht werden, so muss dies als Argument angegeben werden:

./manage.py runserver ip_address:port_number

Soll zum Beispiel auf allen Interfaces auf Port 1080 gelauscht werden, so ist ./manage.py runserver 0.0.0.0:1080 einzugeben. Der Entwicklungsserver wird durch Drücken von [Strg]+[c] beendet. Das manage.py Script verfügt auch über eine Hilfefunktion, welches Auskunft über die vorhandenen Möglichkeiten gibt:

./manage.py help

Nachdem nun das Projekt gestartet ist beginnt man mit dem Anpassen der Datei settings.py. Die möglichen Konfigurationen sind in der Datei ausreichend dokumentiert. Um die Datenbankeinstellungen vornehmen zu können, ist auch eine Datenbank zu erstellen (siehe dazu die betreffenden Abschnitte PostgreSQL beziehungsweise MySQL). Wenn die Einstellungen korrekt sind und die Datenbank konfiguriert ist, so kann die Interaktion des Django Projekts mit der Datenbank getestet werden:

$ ipython
In [1]: from django.db import connection
In [2]: cursor = connection.cursor()

Wenn die obigen Kommandos keinen Output haben, so hat die Verbindung zur Datenbank fehlerfrei funktioniert. Der nächste Schritt ist dann bereits das Erstellen einer ersten Django Applikation im vorhandenen Projekt (ein Projekt kann mehr als eine Applikation umfassen). Eine mögliche Anwendung für die Bibliothek ist eine Benutzerverwaltung.

Starten einer neuen Applikation

./manage.py startapp users

Zuerst sind die Datentabellen in Form von Django Modellen zu definieren. Dazu ist die Datei models.py im automatisch erstellten Verzeichnis users wie folgt zu editieren.

# users/models.py
from django.db import models

class User(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    address = models.CharField(max_length=100)

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

Daraufhin muss die Applikation in die Liste der Applikationen des Projekts in settings.py eintragen werden, bevor die Datentabellen automatisch erstellt werden kann, da Django explizit wissen muss, für welche Anwendungen die Datenmodelle erstellt werden müssen. Davon abgesehen ist es generell eine gute Praxis alle Applikationen, welche von einem Projekt verwendet werden, in die Liste der installierten Applikationen des Projekts einzutragen.

# settings.py
# ...
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'library.users',
)
Gleich danach kann die Datenbank synchronisiert werden, was in diesem Fall gleichbedeutend mit dem Erstellen der Datentabellen ist. Davor sollte man aber noch checken, ob die definierten Modelle valide sind und kann sich gegebenenfalls den erstellten SQL Code ansehen.
./manage.py validate
./manage.py sqlall users
./manage.py syncdb

Nach dem Erstellen der Modelle kann man diese auch direkt in der Datenbankumgebung begutachten, was aber keine Voraussetzung für das Weiterarbeiten ist.

./manage.py dbshell

Es ist wichtig zu verstehen, dass syncdb zwar neue Modelle synchronisiert, aber weder Änderungen an den bestehenden noch das Entfernen von Modellen übernimmt, was also manuell über die dbshell erfolgen müsste. Daraufhin kann ein erster "View", also die Logik hinter der Datenrepräsentation, erstellt werden.

# users/views.py

from models import User
from django.shortcuts import render_to_response

def list(request):
    users = User.objects.all()
    return render_to_response('users/list.html', locals())

Nach dem Programmieren des Views ist dieser in urls.py einzutragen und natürlich noch eine zugehörige Template (im obigen Beispiel users/list.html) im Templateverzeichnis des Projekts zu erstellen (dieses Verzeichnis ist ebenfalls in settings.py definiert).

# urls.py
# ...
urlpatterns = patterns('library.users.views',
    url('^users/$', 'list', name="list"),
)

Aktivieren und Konfigurieren des Admin Interfaces

Django inkludiert eine praktische Administrationsoberfläche, welche einfach zu aktivieren ist. Zuerst müssen die betreffenden Zeilen in urls.py aktiviert werden, indem die Kommentarzeichen entfernt werden.

# urls.py
# Uncomment the next two lines to enable the admin:
    from django.contrib import admin
    admin.autodiscover()
# ...
# Uncomment the next line to enable the admin:
    (r'^admin/(.*)', admin.site.root),
)

Danach ist die Admin-Applikation in settings.py in der Liste der installierten Applikationen einzutragen.

# settings.py
# ...
INSTALLED_APPS = (
    # ...
    'django.contrib.admin',
)

Nun ist die Datenbank nocheinmal zu synchronisieren, wobei auch gleich ein Administrationsbenutzer erstellt wird.

./manage.py syncdb

Nun sollte der Admin (sofern der Entwicklungsserver läuft) bereits unter http://localhost:8000/admin zur Verfügung stehen. Die eigene Anwendung muss jedoch erst in den Admin inkludiert werden. Dazu ist eine admin.py im Verzeichnis der Anwendung zu erstellen, wo auch gleich die Konfiguration des Admins für die eigene Anwendung erfolgen kann (im folgenden Beispiel ist die mögliche Konfiguration nur durch einen Kommentar angedeuted).

# users/admin.py
from django.contrib import admin
from library.users.models import User

# class UserAdmin(admin.ModelAdmin):
    # configuration goes here

admin.site.register(User)

Hier folgt eine (unsortierte) Aufstellung einiger der im Kurs gezeigten Webseiten:

Link kurze Beschreibung
https://www.djangoproject.com/ Offizielle Webseite von Django.
http://www.djangobook.com/en/2.0/ Ein exzellentes englisches Buch mit dem Ziel, den Leser vom Django-Anfänger zu einem Django-Profi zu machen. Es ist auch eine Printversion verfügbar.
API Reference Englische Referenzedokumentation.
[Valid XHTML 1.1!]