NAS-Speicher mit einer Kapazität von einigen Dutzend Terabyte, wie sie sich für mittelständische Anwender eignen, nimmt die ADMIN-Redaktion in der Ausgabe ... (mehr)

Namenstag

In der Regel möchte man in einem Skript die Daten aus einem Formular auswerten. Ein einfaches Exemplar zeigt Listing 2. Die dortige HTML-Datei erstellt ein Formular, das den Vor- und Nachnamen seines Benutzers erfragt und diesen dann per Get-Methode an das Lua-Skript »antwort.lua« schickt.

Listing 2

Datei frage.html mit einem Formular

 

Dessen Inhalt zeigt Listing 3. Zunächst setzt die »handler()« -Funktion den MIME-Typ auf »text/html« und baut dann mit mehreren »r.puts()« den Anfang eines HTML-Dokuments zusammen. Anschließend muss sie an die Daten aus dem Formular gelangen. Dabei hilft wieder das Request-Objekt. Seine Methode »r:parseargs()« liefert alle per Get-Methode gesendeten Parameter in einer sogenannten Tabelle zurück. Diese Datenstruktur kennen andere Programmiersprachen auch als assoziatives Array oder Dictionary.

Listing 3

Formularauswertung antwort.lua

 

Die von »parseargs()« zurückgelieferte Tabelle besitzt für jedes Formularfeld einen Eintrag mit dem Namen des Feldes und dem darin abgelegten Wert. Um an den Vor- und Nachnamen zu kommen, durchläuft die folgende »for« -Schleife die komplette Tabelle. Die »pairs()« -Funktion hilft ihr dabei, indem Sie auf den jeweils nächsten Eintrag in der Tabelle zeigt. In der Variablen »k« landet dabei der Name des Formularfeldes, in »v« sein entsprechender Inhalt.

Die If-Abfrage prüft, ob es sich um den Vornamen handelt. Wenn ja, wandert er in die Variable »vorname« . Analog speichert die Variable »nachname« den Nachnamen. Variablen darf man in Lua einfach immer direkt benutzen und in ihnen zudem beliebige Werte abladen.

Lua-Kenner dürften an dieser Stelle einwenden, dass man sich die ganze Schleife auch sparen und etwa per:

alleparameter = r:parseargs();
vorname = alleparameter["vorname"]

direkt den Vornamen aus der Tabelle holen könnte. Dies führt jedoch zu einer Fehlermeldung, wenn der Vorname aus irgendeinem Grund gar nicht übertragen wurde.

Nachdem in Listing 3 der Vorname und Nachname in ihren entsprechenden Variablen liegen, setzt sie die Funktion »string.format()« zu einer neuen Zeichenkette zusammen. Die Platzhalter »%s« tauscht »string.format()« dabei gegen die Inhalte der Variablen »vorname« und »nachname« . Das Ergebnis landet wiederum in »r:puts()« und somit dem fertigen HTML-Dokument (Abbildung 2). »string.format()« stammt übrigens aus Luas Standardbibliothek »string« , die der Befehl »require« ganz am Anfang hinzuholt.

Abbildung 2: Das Antwort-Skript im Vordergrund nimmt die Anfrage entgegen und bastelt aus dem Namen eine neue Grußmeldung.

Keine Postzustellung

Listing 3 funktioniert nur, wenn das Skript die Formularinhalte per Get erhält. Sofern die Post-Methode zum Einsatz kommt, liefert »r:parsebody()« alle gewünschten Daten. Die verwendete HTTP-Methode verrät »r.method« . Damit lässt sich dann eine Fallunterscheidung wie in Listing 4 basteln. Obwohl sie so auch die offizielle »mod_lua« -Dokumentation vorschlägt, produzierte »parsebody()« in unseren Tests nur eine Fehlermeldung. Ein Blick in den Quellcode von »mod_lua« offenbarte, dass die Funktion zumindest unter Apache 2.4.2 noch gar nicht implementiert ist. Alle weiteren Funktionen und Attribute des Request-Objekts listet übrigens in der offiziellen Dokumentation des Moduls der Abschnitt "Data Structures" auf [7].

Listing 4

Unterscheidung Post und Get in Lua

 

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2022