Blog-Features für Django

<p>The <strong>Trackback-URL</strong> is a way for other blogs to reference this article in their own posts. Therefore the whole communication behind this link is for machines and hardly readable for humans.</p><p>If you wanna send a trackback to this URL, please copy it into the trackback/pingback section of your blogging-software. After that everysthing should work automatically. How exactly trackbacks work, can be found e.g. <a href="http://www.sixapart.com/pronet/docs/trackback_spec" target="_blank">here</a>.</p>

Django BloggerManchmal muss man sich auch Fehler eingestehen können. So war die Serie "Blog mit Django" im letzten Teil eigentlich nicht viel mehr, als die sehr abgekürzte Zusammenfassung der Dinge, die auch in der offiziellen Django-Dokumentation zu haben und deren leichte Veränderung hin zu einem Blogging-System. Eigentlich etwas, was jeder User auch selber kann, wenn er das Tutorial auf den Django-Seiten einmal durchgearbeitet hat. 

Deshalb spare ich mir jetzt den letzten Teil der Serie, in dem es um Frontend-Konfiguration und Templating gegangen wäre und verweise auf den dritten Teil des offiziellen Tutorials, in dem das höchstwarscheinlich viel umfangreicher, ebenfalls beschrieben wird. Hier soll von nun an um Dinge gehen, die auf den offiziellen Django-Seiten nicht so einfach zu finden sind: Blogfeatures in Django, wie RSS-Feeds, Spam-Kontrolle mit Akismet, Gravatar-Integration und Flickr.

RSS-Feed

Hierbei handelt es sich noch um ein Feature, dass ebenfalls bereits direkt durch Django abgedeckt wird und welches sich denkbar einfach integrieren lässt. Hierbei handelt es sich um das sogenannte Syndication, welches bereits Teil des Django-Frameworks ist. Das grundsätzliche Vorgehen wird in der, wieder mal sehr guten, Django-Dokumentation sehr gut beschrieben. Das Ganze findet sich hier.

Spam-Kontrolle mit Akismet

Leider, leider kann man ein modernes Blog ja nicht mehr ohne Spam-Kontrolle denken. Zu viele böse Bots durchforsten das Internet nach beliebigen abschickbaren Formularen. Zur Abwehr solchen Spams eignet sich hervorragen Akismet. Ein Dienst um Kommentare vor dem Abspeichern auf ihre Spammigkeit zu kontrollieren. Um Akismet auch für das eigene Blog frei verwenden zu können muss man einen API-Schlüssel beantragen, den man durch das anmelden eines Wordpress-Blog Accounts kostenfrei bekommt. Für Akismet gibt es in vielen Sprachen eine entsprechende Umsetzung. So auch in Python: Wie auf den Akismet-Seiten bereits empfohlen kann auch ich nur David Lynchs Python Bibliothek empfehlen. Die Integration in eine Kommentierfunktion ist dann denkbar einfach:

import akismet
...
name = request.REQUEST['name']
email = request.REQUEST['email']
text = request.REQUEST['text']
url = request.REQUEST['url']

try:
    real_key = akismet.verify_key(AKISMET_API_KEY,"<BLOG-URL>")
    if real_key:
        is_spam = akismet.comment_check(AKISMET_API_KEY,"<BLOG-URL>",
            request.META['REMOTE_ADDR'], request.META['HTTP_USER_AGENT'],
            comment_content=text,comment_author=name,comment_author_email=email,comment_author_url=url)
        if is_spam:
            print "SPAM-Kommentar abgelehnt! %s:%s:%s" % (text,email,name)
        else:
            <Kommentar abspeichern>
except akismet.AkismetError, e:
    print "%s - %s" % (e.response, e.statuscode)

Man ruft in seiner View-Methode in Django einfach die Akismet-API auf und lässt den Kommentar gegenchecken. Akismet prüft dabei nicht nur den Inhalt und die Email-Adresse sondern checkt auch die Herkunft über die IP. ACHTUNG: Dabei muss man aufpassen nicht allzu häufig von der selben IP, z.B. hinter einem Router, an Akismet zu posten. Akismet nutzt nämlich auch temporäre Blacklist, um evtl. Spammer, völlig losgelöst vom Inhalt, für einge Zeit vom Kommentieren abzuhalten.

Flickr-Fotos integrieren

FlickrDie eigene Flickr-Fotosammlung ist Dank einer existierenden Python-Bibliothek ähnlich leicht zu integrieren, wie Akismet. Allerdings verlangt es eine Flickr-Bibliothek nach einem API-Schlüssel, der den Zugriff auf Flickr regelt. Flickr vergibt hierzu Schlüssel auf Bewerbung. Hier kann man einen Grund angeben und seine eigenen Schlüssel anschließend verwalten. Auch in diesem Bereich zeigt Flickr mal wieder seine sehr sehr guten Webservice-Qualitäten.

Für die Integration in das eigene Django-Projekt empfiehlt sich nun wiederum die Python-Bibliothek von James Clark, die man hier herunterladen kann. Der entsprechende Code für die Abfrage ist wiederum ziemlich einfach:

flickr_error = False
flickr_photos = []
try:
    user = flickr.people_findByUsername(FLICKR_USER)
    photos = flickr.photos_search(user_id=user.id)
    for p in photos:
        urlt = "http://static.flickr.com/%s/%s_%s_s.jpg" % ( p.server, p._Photo__id, p.secret )
        url = "http://www.flickr.com/photos/%s/%s/" % (FLICKR_USER,p.id)
        flickr_photos.append(PhotoInfo(url,urlt,p.title));
except Exception, e:
    flickr_error = e

Dieser Code weicht ein bisschen von dem ab, was James Clark in seinen Beispielen zeigt. Hier wird ein extra PhotoInfo-Objekt verwendet, um die Informationen zu den Bildern noch etwas verändern zu können. Die Flickr-Bibliothek gibt nämlich zu den Bildern leider nicht die Detailansicht als URL zurück, sondern die URL zu der Seite, mit den Downloads der Bilder.

Auch hier wieder ein kleines ACHTUNG: Eine Flickr-Anfrage ist eine recht aufwendige Geschichte, d.h. es ist eine seperate HTTP-Anfrage, die auf Antwort warten muss. Das verlängert die Anfrage an das eigene Blog mitunter extrem, wenn man keine Gegenmaßnahmen ergreift. Zum einen lässt sich der gesamte Flirck-Bereich in AJAX umsetzen, so dass die Bilder asynchron nachgeladen werden, oder aber man verwendet direkt eines der hervorragenden Cachings im Django-Framework. Beides wird zum Beispiel hier im Blog auch gemacht.

Gravatare integrieren

Seitdem der Gravatar-Service überarbeitet wurde, ist er wieder konstant verfügbar und es lohnt sich seine Integration, um die Kommentare mit Bildern aufzuhübschen. Auch für die Integration von Gravatare gibt es dankenswerterweise wiederum eine Python-Bibliothek. Die Bibliothek von Andrea Peltrin ist dabei so einfach zu verwenden, dass sie sich sogar direkt in die Kommentar-Klasse im Django-Modell integrieren lässt:

class Comment(models.Model):
    url = models.CharField("Homepage",maxlength=200,blank=True)
    ...
    def gravatar(self):
        return gravatar.get_uri(self.email, default='<Absolute URL des Default-Avatars>')

Die zurückgegebene URL lässt sich nun einfach per {{comment.gravatar}} in einem IMG Tag im Template verwenden, und schon ist das eigene Django-Projekt der zwonull Sphäre einen Schritt näher.

Vorher: Blog mit Django: Design & Konzept
Vorher: Blog mit Django: XHTML/CSS
Vorher: CSS-Coding-Tipps
Vorher: Blog mit Django: Installation & Datenmodell 

Comments

  • Pot01:03 09.12.2007

    Danke für diese tolle Blog-Reihe, hat mir sehr weitergeholfen und vorallem mein Interesse in Django noch mehr geweckt ;-)
    Das mit Gravatar kannte ich noch gar nicht, auch danke dafür.

    Grüsse,
    Pot

  • Tim01:38 09.12.2007

    Da hast Du Dir aber auch gleich einen besonders "interessanten" Gravatar erstellt. Der macht sich gut hier :)!

Add a comment

Give your name to us, stranger!

This field is just for spam-detection!

Is the url written correctly?

You oppinion is still missing!


Sending comment

Sidenotes

  • Conditional Comments und MultipleIEs
    Wer schonmal versucht hat in seiner MultipleIE-Installation auf die Funktionalität der Conditional Comments zuzugreifen, der wird feststellen, die die überprüfte Version immer die vom aktuell installieren Haupt-IE ist. Aber es gibt Abhilfe.
  • Apple vs. Psystart-Klage zum Erfolg verdammt
    Man macht sich eigentlich gar nicht so den Kopf drum: Aber was wäre, wenn Apple die Klage gegen Psystar in irgendeiner Form verlieren würde. Tür und Tor wären geöffnet für weitere Mac-Klons.
  • Vista zur Ruhe legen
    In der Geschichte von Microsofts Betriebssystemen gab es schon einmal den Fall, dass man ein unpassend geratenes System durch die 2nd-Edition des Vorgängers ersetzte "Windows ME". Vielleicht sollte man das auch mit Vista machen...

Photo-stream

AJAX Load-Indicator
Photos are being loaded