Skip to content

nanoc und MySQL

Ein static site generator wie bspw. nanoc erzeugt, wie der Name schon sagt, im wesentlichen statische Seiten ohne - zumindest serverseitige - dynamische Elemente, oder schlicht: HTML-Dateien. Dennoch ist es möglich, solchen Webpräsenzen eine begrenze “Dynamik” zu verleihen, und dies nicht nur durch Einbindung von Drittanbieter-Diensten wie bspw. der Kommentar- und Diskussionsplattform Disqus - soll sich der Inhalt einer oder mehrerer Seiten ändern, müssen sie eben neu generiert werden.

Üblicherweise wird die Neugenerierung immer dann (manuell) veranlasst, wenn eine neue Seite oder ein neuer Beitrag (in einem statisch generierten Blog) verfasst oder ein bestehendes Quelldokument verändert worden ist. Jedoch kann eine Neugenerierung der Seiten auch angestoßen durch externe Ereignisse erfolgen. Man könnte bspw. immer dann, wenn ein neuer Beitrag eines bestimmten Accounts auf Twitter veröffentlicht wird, diesen Tweet in die Webseiten einbinden und dann die dadurch veränderten Seiten neu generieren - oder, bspw., einen RSS-Feed regelmäßig (täglich, stündlich, …) auslesen und bei einer Änderung die betreffenden Seiten der (eigentlich statischen) Webpräsenz neu generieren und auf diese Weise einen Newsticker einbinden, der allerdings nicht in Echtzeit “tickt”. Sehr häufig ist eine solche Echtzeit-Aktualisierung aber auch gar nicht nötig, weil sich Änderungen ohnehin nur in größeren Zeitabständen ergeben und es unschädlich ist, wenn sie mit einer gewissen Verzögerung angezeigt werden. So bindet bspw. der CCCS in seinen durch nanoc erzeugten Webseiten die Tweets des Accounts @cccs ebenso ein wie eine Übersicht der Blogbeiträge von Aktiven des Vereins. Die entsprechenden Daten werden in regelmäßigen Abständen ausgelesen, danach werden dann - wenn erforderlich - die betreffenden Webseiten neu erzeugt.

Die Dynamik lässt sich aber noch deutlich weiter treiben.

Dynamische Seiten sind regelmäßig mit einer Datenbank verknüpft. Blogsysteme und CMS beispielsweise speichern Beiträge, Metadaten, Kommentare usw. in einer Datenbank und erzeugen beim Aufruf des Blogs oder der Website daraus bedarfsgerecht HTML-Seiten, die dann angezeigt (und ggf. gecached) werden. Seiteninhalte, Blogeinträge oder Kommentare werden in der Datenbank gespeichert und (ggf. nach Prüfung) beim nächsten Aufruf der Website oder des Blogs dann angezeigt.

Auch nanoc lässt sich mit einer Datenbank als Datenquelle betreiben. Bei jedem Durchlauf von nanoc compile wird dann nicht nur geprüft, ob sich die Quelldateien der Webpräsenz verändert haben, sondern auch, ob sich die Inhalte der Datenbank geändert haben; in beiden Fällen werden dann, wenn sich diese Änderungen auf die anzuzeigenden Inhalte auswirken, die entsprechenden statischen Webseiten neu erzeugt. So ist es bspw. durchaus denkbar, ein Webinterface zu schreiben, mit dem Seiteninhalte und Templates erzeugt und bearbeitet werden können, aus denen dann nanoc fertige Webseiten erzeugt - quasi ein CMS. Oder man erzeugt seine Blogbeiträge nicht als einzelne Quelldateien in HTML, Markdown oder anderweitig, sondern schreibt sie über ein - beliebig komfortabel gestaltetes - Webinterface in eine Datenbank und lässt nanoc dann daraus das fertige Blog gestalten. In ähnlicher Weise könnten so Informationen über Mitarbeiter (Rufnummer, Erreichbarkeit, Zuordnung zu Arbeitsbereichen) für eine Firmenwebsite oder Profile von Mitgliedern einer Gruppe oder eines sozialen Netzwerks in einer Datenbank gehalten und die - statische - Website bei Änderungen neu erzeugt werden.

Diese Vorgehensweise kann immer dann sinnvoll sein, wenn die Inhalte größtenteils statisch sind und/oder sich in eher größeren Abständen ändern. Werden in einem Blog in der Woche ein oder zwei Beiträge verfasst, wäre es überhaupt kein Problem, zwei- oder dreimal pro Woche eine ansonsten statische Website neu zu erzeugen; und Daten von Mitarbeitern oder Mitgliedern oder auch die einzelnen Seiten einer größeren Webpräsenz ändern sich zumeist eher seltener. Erforderlich ist letztendlich nur, dass entweder in regelmäßigen Abständen - per cron - geprüft wird, ob sich Änderungen an den Inhalten in der Datenbank ergeben haben, so dass die Website neu erzeugt werden muss, oder mit dem Speichern (oder der Freigabe) einer Änderungen automatisch einen Rebuild anzustoßen und die Website dann auch in die Echtumgebung zu übertragen (“Deployment”).

Die eigentliche Anbindung der Datenbank als Datenquelle an nanoc ist recht einfach gelöst und in der Dokumentation in Form eines nachvollziehbaren Beispiels bzw. Tutorials - mit sqlite, aber die Anpassung an MySQL ist trivial - unter der Überschrift “Using external sources” dargestellt. Einige kleinere Lücken der Darstellung, die einer 1:1-Umsetzung des Beispiels per copy & paste entgegenstanden, habe ich demletzt geschlossen.

In diesem Beispiel wird aus jedem Datensatz (Row) in der Datenbank(tabelle) ein Item in nanoc erzeugt, bei dem (nur) die Felder des Datensatzes (Columns) und deren Inhalte als Attribute übergeben werden - vergleichbar einer Quellcodedatei, die nur Metadaten in YAML enthält. Stattdessen könnte man natürlich auch direkt anzeigbare Seiten (im Beispiel Informationsseiten für jeden Mitarbeiter) erzeugen, indem ein Template mit den Daten befüllt wird; oder man übernimmt einen Feldinhalt aus der Datenbank als Seiteninhalt, bspw. für einen Blogpost. Die Möglichkeiten sind fast unbegrenzt. Die Datenbankinhalte lassen sich dann über ein anderes, geeignetes Interface - bspw. eine Webanwendung in PHP oder anderen Sprache - bearbeiten.

Ich habe bei der Erstellung von d-e-n.net auf diese Weise für die “Schreiberliste” die ohnehin schon in Form einer MySQL-Datenbank vorhandenen Inhalte der Profile der einzelnen Teilnehmer ausgelesen und erzeuge - derzeit in einem zweiten Schritte - daraus dann die Profilseiten, und natürlich die Übersicht der eingetragenen Teilnehmer. Ich bin aber sicher, dass sich die Profilseiten auch unmittelbar beim Auslesen der Datenbank erzeugen lassen, ohne den Umweg über (nicht compilierte, weil bis auf Metadaten leere) Items unter /_external/db/* zu gehen.

Das werde ich bei Gelegenheit dann einmal ausprobieren.

Trackbacks

Netz - Rettung - Recht am : Externe Datenquellen für nanoc

Vorschau anzeigen
Bereits vor gut zwei Jahren hatte ich berichtet, wie man nanoc mit einer (MySQL-)Datenbank als Datenquelle betreiben kann, und auf die entsprechende Dokumentation verwiesen. Schon damals hatte ich angemerkt, dass sich in dem dort gezeigten Weg möglicherwe

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

Kommentar schreiben

HTML-Tags werden in ihre Entities umgewandelt.
Markdown-Formatierung erlaubt
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
BBCode-Formatierung erlaubt
Gravatar, Identicon/Ycon Autoren-Bilder werden unterstützt.
Formular-Optionen