Open Source im professionellen Einsatz
Linux-Magazin 11/2013
© Elnur Amikishiyev, 123RF.com

© Elnur Amikishiyev, 123RF.com

Das Python-Framework Django

Django unchained

Alle befragten Django-Entwickler waren über die vom Linux-Magazin gestellte Aufgabe nicht glücklich: Mit einem CMS sei das wesentlich einfacher zu lösen, hieß es. Autor Sven Schannak zeigt, wie es trotzdem klappt.

776

Mit Django 1.5, das die vom Linux-Magazin gestellte Aufgabe bewältigen soll, betritt ein in Python verfasstes Framework die illustre Runde. Seit Version 1.3 bringt Django die so genannten Class-based Views (CBV) mit, die den Zeitaufwand für das Entwickeln weniger komplexer Aufgaben minimieren. Grundlage für den Code bieten die offizielle Django-Doku [1] und die Anregungen aus dem Referenzwerk "Two Scoops of Django" [2]. Zum besseren Verständnis der hier eingesetzten Techniken empfiehlt sich zudem der Blick in das Tutorial des Django-Projekts [3].

Doch die CBV kosten: Wer sie nutzen will, muss eine steilere Lernkurve akzeptieren als bei den traditionellen Functional-based Views (FBV). Aber durch die Zeitersparnis beim Entwickeln lohnt sich der Mehraufwand am Ende. FBVs ließen sich für die Lösung der Aufgabe aber auch verwenden.

An die Quelle

Um die offene Datenquelle anzuzapfen und die Berliner und Brandenburger Volks- und Straßenfeste [4] auf einer Webseite anzuzeigen, lässt sich das mitgelieferte REST-API mit XML- oder Json-Schnittstellen einsetzen. Das Python-Framework kann zwar mit beiden Datentypen arbeiten, im Artikel kommt jedoch Json als favorisiertes Format zum Einsatz. Um außerdem nicht ständig Requests an den Portalbetreiber zu senden, soll Django die Daten cachen und aufbereiten, falls ein Besucher der Webseite zum Beispiel nach dem Termin für das Berliner Bierfestival [5] sucht.

Um die Daten serverseitig zu holen, gibt es mehrere Ansätze: Zum Beispiel ließe sich das Task-Framework Celery mit dem Plugin »django-celery« einspannen, das einige großartige Funktionen für das Bewältigen periodisch wiederkehrender Aufgaben mitbringt. Allerdings wäre der Konfigurationsaufwand recht hoch, weshalb ein so genannter Management-Befehl diese Aufgabe übernimmt. Ihn ruft der Entwickler direkt aus der Shell heraus auf. Er lässt sich als Cronjob einrichten, der die Daten regelmäßig von der Quelle abholt und aktualisiert. Die Entwicklung dieses Befehls macht den Anfang des Artikels.

Nach dem Einrichten von Django [1] erstellt der Programmierer zunächst eine App mit dem Namen »streetparty« :

django-admin.py startapp streetparty

Der Management-Befehl gehört in einen Ordner mit dem Namen »management« , den er unterhalb von »streetparty« anlegt. Darin legt er zudem eine leere Datei mit der Bezeichnung »__init__.py« und einen weiteren Ordner »commands« an, welcher ebenfalls eine Datei »__init__.py« enthalten soll. An ihr erkennt Python, dass sich in den Ordnern Python-Skripte befinden. Im Verzeichnis »commands« erstellt der Entwickler zudem die Datei mit dem Code zum Holen der Daten. Im Beispiel heißt sie »get_data.py« und enthält den Code aus Listing 1.

Listing 1

get_data.py

01 from django.core.management.base import BaseCommand
02 from streetparty.helper import StrassenFestHelper
03
04
05 class Command(BaseCommand):
06     help = 'Holt die aktuellen Daten der Straßenfeste'
07
08     def handle(self, *args, **options):
09         StrassenFestHelper().update()
10

Management-Befehle ähneln sich stets im Aufbau: Es muss eine Klasse »Command« geben, die mindestens von »BaseCommand« erbt. In der Methode »handle()« wird dann die eigentliche Logik implementiert, wobei Management-Befehle auch Argumente empfangen können. Das Beispiel bindet zusätzlich noch einen Hilfetext ein.

Hilfe beim Straßenfest

Die Methode selbst ruft eine andere Methode der Klasse »StrassenFestHelper« auf, die später implementiert wird und die Daten in die Datenbank schreibt. Diese Klasse in der neu anzulegenden Datei »streetparty/helper.py« schreibt der Django-Entwickler. Den Code für die Helferklasse zeigt Listing 2.

Listing 2

helper.py

01 import sys
02 import json
03 import urllib2
04 from datetime import datetime
05 from django.conf import settings
06 from django.core.exceptions import ValidationError
07 from streetparty.models import StrassenFest
08
09 class StrassenFestHelper():
10     def update(self):
11         req = urllib2.Request(settings.STREETPARTY_DATA_URL)
12         opener = urllib2.build_opener()
13         source = opener.open(req)
14         StrassenFest.objects.all().delete()
15
16         for data in json.load(source)['index']:
17             data['von'] = datetime.strptime(data['von'], '%Y-%m-%d')
18             data['bis'] = datetime.strptime(data['bis'], '%d.%m.%Y')
19             data['api_id'] = data.pop('id')
20             fest = StrassenFest(**data)
21             try:
22                 fest.full_clean()
23             except ValidationError as e:
24                 print >>sys.stderr, 'Failed to validate remote entry with id %s' % data['id']
25                 print >>sys.stderr, str(e)
26             else:
27                 fest.save()

In der vorgegebenen Datenquelle ist ein »id« -Feld vorhanden, allerdings verrät die Dokumentation nicht, ob die IDs eindeutig vergeben sind. Bekommen zwei Feste zufälligerweise die gleiche ID zugewiesen, kann es zu Konflikten kommen. Daher löscht die Funktion »update()« die Datensätze zunächst, um sie dann komplett neu einzuspielen. Im Modell sichert das Feld »api_id« die ID der Datenquelle. Um letztere nicht als Primary Key zu verwenden, setzt die Funktion den Schlüssel für »id« auf »api_id« um.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Sturmritt

    Das Geizen mit Entwicklungszeit ist das erklärte Ziel des Webframeworks Django. Es enthält leistungsfähige Automationen und reizt das Don't-repeat-yourself-Prinzip voll aus.

  • Asyl für Django

    Der Trend zu Webapplikationen zwingt einstige HTML-Künstler ins Programmiererlager. Nur, wo schaut man sich einen guten und effizienten Stil ab? Der folgende Artikel beschreibt, wie ein Python-Guru mit Hang zu einem gewissen Django und ein PHP-Papst eine von der Redaktion vorgegebene Aufgabe lösen.

  • Tntnet

    Angeregt durch die "Reifeprüfung fürs Web" im Linux-Magazin 11/13 stellt dieser Artikel das Webframework Tntnet vor. Mit ihm lassen sich in C++ Webanwendungen mit MVC-Architektur programmieren.

  • Flask

    Das Micro-Webframework Flask ist aus einem Aprilscherz entstanden. Mittlerweile erfreut die leichtgewichtige Django-Alternative viele Webentwickler mit einem Hang zu Python.

  • Bewertung

    Viele Wege führen ans Ziel, das gilt auch für die Wahl von Software für die Website. Wer aber zuerst ankommt und unterwegs Angenehmes erlebt, ist klar im Vorteil. Der Versuch einer Podest-Zuweisung.

comments powered by Disqus

Ausgabe 11/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.