ich habe einen Server mit einer Webseite und ein paar einfachen CGI-Skripten. Dafür benutze ich nginx, fcgiwrap, meistens die POST-Methode und Python mit dem cgi-Modul. Bei einem dieser Skripte wird eine hochgeladene Datei verarbeitet, bei den anderen einfach nur Formular-Eingaben.
In meiner nginx-Konfigurationsdatei gibt es also einen Abschnitt, der so aussieht:
Code: Alles auswählen
location /cgiskript.py {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /pfad/cgiskript.py;
fastcgi_param QUERY_STRING $query_string;
fastcgi_pass unix:/run/fcgiwrap.socket;
}
Mit anderen Worten, das Gerümpel fliegt jetzt aus der Standardbibliothek, wer's braucht soll sich geeignete Libraries per PIP installieren. Was ist der geeignete Ersatz für das cgi-Modul? Das steht in einer Tabelle in jenem PEP: es gibt keinen Ersatz.This PEP proposed a list of standard library modules to be removed from the standard library.
...
Back in the early days of Python, the interpreter came with a large set of useful modules. This was often referred to as “batteries included” philosophy and was one of the cornerstones to Python’s success story. Users didn’t have to figure out how to download and install separate packages in order to write a simple web server or parse email.
Times have changed. With the introduction of PyPI (née Cheeseshop), setuptools, and later pip, it became simple and straightforward to download and install packages. Nowadays Python has a rich and vibrant ecosystem of third-party packages. It’s pretty much standard to either install packages from PyPI or use one of the many Python or Linux distributions.
Weiter unten im PEP steht dann:
Ja. Da meine Skripte aber nur sehr selten (circa einmal im Monat) aufgerufen werden, ist mir das mit den neuen Prozessen völlig egal. Nicht jeder entwickelt Web-Apps, die jeden Tag von hunderttausend Menschen benutzt werden.cgi
The cgi module is a support module for Common Gateway Interface (CGI) scripts. CGI is deemed as inefficient because every incoming request is handled in a new process. PEP 206 considers the module as:
“[…] designed poorly and are now near-impossible to fix (cgi) […]”
Diese Python-Version werde ich noch mindestens 2 Jahre weiter benutzen, so lange muss ich noch nichts ändern. Nun ist die Frage: was soll ich statt Python und dem cgi-Modul benutzen?
Auf Perl/Ruby/Shellskripte/PHP umsteigen ist wohl keine gute Idee -- erstens möchte ich keine neue Sprache einführen, und zweitens nutzen manche der Skripte auch Bibliotheken, die es so nur für Python gibt. Und drittens: was ist, wenn auch diese Sprachen beschließen, ihre CGI-Funktionalität zu deprecaten?
Zur allergrößten Not würde ich auf Python mit Flask umsteigen, aber grundsätzlich gefällt mir die Vorgehensweise mit dem cgi-Modul.
Um die Benutzereingaben zu bekommen, verwende ich ein cgi.FieldStorage(). Dazu steht in dem PEP:
Die multipart-Bibliothek https://pypi.org/project/multipart/ ist auf dem PyPI zu finden, sie wurde offenbar seit über 2 Jahren nicht aktualisiert und ist auch nicht dokumentiert. Vielleicht würde ich sie trotzdem verwenden, aber dass man verschiedene Vorgehensweisen für POST und GET braucht finde ich auch nicht toll.FieldStorage/MiniFieldStorage has no direct replacement, but can typically be replaced by using multipart (for POST and PUT requests) or urllib.parse.parse_qsl (for GET and HEAD requests)
Außerdem geht es bei multipart und urllib.parse.parse_qsl offenbar nur ums Parsen. Wie bekomme ich die Formulareingaben überhaupt in mein Programm rein? Landen die irgendwie auf stdin?
Eigentlich ist meine Frage nur: wenn es das cgi-Modul nicht mehr gibt, was ist dann die einfachste verbliebene Möglichkeit, serverseitig mit Python Eingaben aus Webformularen zu verarbeiten?
Nette Grüße -- ich wünsche euch eine schöne Woche.