Python-CGI-Programmierung


Was ist CGI

CGI wird derzeit von NCSA gepflegt, und NCSA definiert CGI wie folgt:

CGI (Common Gateway Interface), eine allgemeine Gateway-Schnittstelle, ist ein Programm, das auf einem Server wie einem HTTP-Server ausgeführt wird und eine Schnittstelle zu HTML-Seiten für Clients bereitstellt.


Web-Browsing

Um besser zu verstehen, wie CGI funktioniert, können wir uns den Prozess ansehen, der beim Klicken auf einen Link oder eine URL auf einer Webseite abläuft:

  • 1. Verwenden Sie Ihren Browser, um auf die URL zuzugreifen und eine Verbindung zum HTTP-Webserver herzustellen.
  • 2. Nach Erhalt der Anfrage analysiert der Webserver die URL und prüft, ob die aufgerufene Datei auf dem Server existiert. Wenn ja, gibt er den Dateiinhalt zurück; wenn nicht, gibt er die entsprechende Fehlermeldung zurück.
  • 3. Der Browser empfängt die Informationen vom Server und zeigt die empfangene Datei oder Fehlermeldung an.

CGI-Programme können Python-Skripte, PERL-Skripte, SHELL-Skripte, C- oder C++-Programme usw. sein.


CGI-Architekturdiagramm

cgiarch


Webserver-Unterstützung und -Konfiguration

Bevor Sie mit der CGI-Programmierung beginnen, stellen Sie sicher, dass Ihr Webserver CGI unterstützt und ein CGI-Handler konfiguriert ist.

Apache-CGI-Konfiguration:

CGI-Verzeichnis einrichten:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

Alle von HTTP-Servern ausgeführten CGI-Programme werden in einem vorkonfigurierten Verzeichnis gespeichert. Dieses Verzeichnis wird CGI-Verzeichnis genannt und wird konventionsgemäß /var/www/cgi-bin benannt.

CGI-Dateien haben die Erweiterung .cgi, und Python kann auch die Erweiterung .py verwenden.

Standardmäßig sind Linux-Server so konfiguriert, dass das cgi-bin-Verzeichnis in /var/www ausgeführt wird.

Wenn Sie ein anderes Verzeichnis für die Ausführung von CGI-Skripten angeben möchten, können Sie die Konfigurationsdatei httpd.conf wie folgt ändern:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options +ExecCGI
   Order allow,deny
   Allow from all
</Directory>

Fügen Sie AddHandler das Suffix .py hinzu, damit wir auf Python-Skriptdateien mit der Endung .py zugreifen können:

AddHandler cgi-script .cgi .pl .py

Erstes CGI-Programm

Wir verwenden Python, um unser erstes CGI-Programm namens hello.py zu erstellen, das sich im Verzeichnis /var/www/cgi-bin befindet, mit folgendem Inhalt:

Beispiel

#!/usr/bin/python3

print ("Content-type:text/html")
print ()                             # Leerzeile, teilt dem Server mit, dass der Header beendet ist
print ('<html>')
print ('<head>')
print ('<meta charset="utf-8">')
print ('<title>Hallo Welt - Mein erstes CGI-Programm!</title>')
print ('</head>')
print ('<body>')
print ('<h2>Hallo Welt! Ich bin das erste CGI-Programm von Example Tutorial</h2>')
print ('</body>')
print ('</html>')

Nachdem Sie die Datei gespeichert haben, bearbeiten Sie hello.py und setzen Sie die Dateiberechtigungen auf 755:

chmod 755 hello.py 

Das Ergebnis beim Zugriff auf das obige Programm in einem Browser ist wie folgt:

Das hello.py-Skript ist ein einfaches Python-Skript. Die erste Ausgabezeile, "Content-type:text/html", wird an den Browser gesendet, um dem Browser mitzuteilen, dass der angezeigte Inhaltstyp "text/html" ist.

Verwenden Sie print, um eine leere Zeile auszugeben und dem Server mitzuteilen, dass die Header-Informationen vollständig sind.


HTTP-Header

"Content-type:text/html" in der Datei hello.py ist Teil des HTTP-Headers. Er wird an den Browser gesendet, um dem Browser den Inhaltstyp der Datei mitzuteilen.

Das Format des HTTP-Headers ist wie folgt:

HTTP 字段名: 字段内容

Zum Beispiel:

Content-type: text/html

Die folgende Tabelle beschreibt die Informationen, die in CGI-Programmen häufig in HTTP-Headern verwendet werden:

headBeschreibung
Content-type: Der MIME-Typ, der der Anfrageentität entspricht. Zum Beispiel: Content-type:text/html
Expires: Datum Das Datum und die Uhrzeit, zu denen die Antwort abläuft
Location: URL Wird verwendet, um den Empfänger zu einem anderen Ort als der angeforderten URL umzuleiten, um die Anforderung abzuschließen oder eine neue Ressource zu identifizieren
Last-modified: DatumDie letzte Änderungszeit der angeforderten Ressource
Content-length: NDie Inhaltslänge der Anforderung
Set-Cookie: String HTTP-Cookie setzen

CGI-Umgebungsvariablen

Alle CGI-Programme erhalten die folgenden Umgebungsvariablen, die in CGI-Programmen eine wichtige Rolle spielen:

VariablennameBeschreibung
CONTENT_TYPEDer Wert dieser Umgebungsvariable gibt den MIME-Typ der übergebenen Informationen an. Derzeit ist die Umgebungsvariable CONTENT_TYPE im Allgemeinen: application/x-www-form-urlencoded, was bedeutet, dass die Daten aus einem HTML-Formular stammen.
CONTENT_LENGTHWenn der Server über POST mit dem CGI-Programm kommuniziert, gibt diese Umgebungsvariable die Anzahl der gültigen Datenbytes an, die aus der Standardeingabe (STDIN) gelesen werden können. Diese Variable muss beim Lesen von Eingabedaten verwendet werden.
HTTP_COOKIEDer COOKIE-Inhalt auf dem Client-Rechner.
HTTP_USER_AGENTStellt Client-Browser-Informationen bereit, einschließlich Versionsnummern oder anderer proprietärer Daten.
PATH_INFODer Wert dieser Umgebungsvariable stellt zusätzliche Pfadinformationen dar, die auf den Namen des CGI-Programms folgen. Er wird oft als Parameter für das CGI-Programm verwendet.
QUERY_STRINGWenn der Server Informationen mithilfe der GET-Methode an das CGI-Programm übergibt, ist der Wert dieser Umgebungsvariable die übergebenen Informationen. Diese Informationen folgen auf den Namen des CGI-Programms, getrennt durch ein Fragezeichen '?'.
REMOTE_ADDRDer Wert dieser Umgebungsvariable ist die IP-Adresse des Clients, der die Anfrage stellt, zum Beispiel 192.168.1.67 oben. Dieser Wert ist immer vorhanden. Er ist die einzige Kennung, die der Webclient dem Webserver bereitstellen muss, und kann in CGI-Programmen verwendet werden, um verschiedene Webclients zu unterscheiden.
REMOTE_HOSTDer Wert dieser Umgebungsvariable enthält den Hostnamen des Clients, der die CGI-Anfrage sendet. Wenn Sie ihn nicht abfragen möchten, muss diese Umgebungsvariable nicht definiert werden.
REQUEST_METHODGibt die Methode an, mit der das Skript aufgerufen wurde. Bei Skripten, die das HTTP/1.0-Protokoll verwenden, sind nur GET und POST sinnvoll.
SCRIPT_FILENAMEDer vollständige Pfad des CGI-Skripts
SCRIPT_NAMEDer Name des CGI-Skripts
SERVER_NAMEDies ist der Hostname, der Alias oder die IP-Adresse Ihres Webservers.
SERVER_SOFTWAREDer Wert dieser Umgebungsvariable enthält den Namen und die Versionsnummer des HTTP-Servers, der das CGI-Programm aufgerufen hat. Zum Beispiel ist der Wert oben Apache/2.2.14(Unix)

Das folgende ist ein einfaches CGI-Skript, das CGI-Umgebungsvariablen ausgibt:

Beispiel

#!/usr/bin/python3

import os

print ("Content-type: text/html")
print ()
print ("<meta charset=\"utf-8\">")
print ("<b>Umgebungsvariablen</b><br>")
print ("<ul>")
for key in os.environ.keys():
    print ("<li><span style='color:green'>%30s </span> : %s </li>" % (key,os.environ[key]))
print ("</ul>")

Speichern Sie das Obige als test.py, setzen Sie die Dateiberechtigungen auf 755, und das Ausführungsergebnis ist wie folgt:


GET- und POST-Methoden

Browser-Clients übermitteln Informationen auf zwei Arten an den Server: die GET-Methode und die POST-Methode.

Datenübermittlung mit der GET-Methode

Die GET-Methode sendet codierte Benutzerinformationen an den Server. Die Daten sind in der URL der angeforderten Seite enthalten und durch ein "?"-Zeichen getrennt, wie unten gezeigt:

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
Einige weitere Hinweise zu GET-Anfragen:
  • GET-Anfragen können zwischengespeichert werden
  • GET-Anfragen bleiben im Browserverlauf
  • GET-Anfragen können als Lesezeichen gespeichert werden
  • GET-Anfragen sollten nicht verwendet werden, wenn sensible Daten verarbeitet werden
  • GET-Anfragen haben Längenbeschränkungen
  • GET-Anfragen sollten nur zum Abrufen von Daten verwendet werden

Einfaches URL-Beispiel: GET-Methode

Das Folgende ist eine einfache URL, die die GET-Methode verwendet, um zwei Parameter an das Programm hello_get.py zu senden:

/cgi-bin/hello_get.py?name=Example&url=http://www.example.com

Das Folgende ist der Code der Datei hello_get.py:

Beispiel

#!/usr/bin/python3

# CGI-Verarbeitungsmodul
import cgi, cgitb

# Eine Instanz von FieldStorage erstellen
form = cgi.FieldStorage()

# Daten abrufen
site_name = form.getvalue('name')
site_url  = form.getvalue('url')

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print (<title>Beispiel CGI-Test Beispiel</title>)
print ("</head>")
print ("<body>")
print (<h2>%s offizielle Website: %s</h2> % (site_name, site_url))
print ("</body>")
print ("</html>")

Nach dem Speichern der Datei bearbeiten Sie hello_get.py und ändern die Dateiberechtigung auf 755:

chmod 755 hello_get.py 

Ausgabeergebnis der Browser-Anfrage:

Einfaches Formularbeispiel: GET-Methode

Das Folgende ist ein HTML-Formular, das die GET-Methode verwendet, um zwei Datenelemente an den Server zu senden. Das übermittelte Serverskript ist ebenfalls die Datei hello_get.py. Der Code von hello_get.html lautet wie folgt:

Beispiel

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Beispiel (example.com)</title>
</head>
<body>
<form action="/cgi-bin/hello_get.py" method="get">
Seitenname:<input type="text" name="name">  <br />

Seiten-URL:<input type="text" name="url" />
<input type="submit" value=Absenden />
</Form>
</body>
</html>

Standardmäßig kann das Verzeichnis cgi-bin nur Skriptdateien speichern. Wir speichern hello_get.html im Verzeichnis test und ändern die Dateiberechtigung auf 755:

chmod 755 hello_get.html

GIF-Demo ist wie unten gezeigt:

Datenübermittlung mit der POST-Methode

Die Verwendung der POST-Methode zum Übermitteln von Daten an den Server ist sicherer und zuverlässiger. Für vertrauliche Informationen wie Benutzerpasswörter sollte POST verwendet werden, um Daten zu übertragen.

Das Folgende ist ebenfalls hello_get.py. Es kann auch POST-Formulardaten verarbeiten, die vom Browser übermittelt werden:

Beispiel

#!/usr/bin/python3

# CGI-Verarbeitungsmodul
import cgi, cgitb

# Eine Instanz von FieldStorage erstellen
form = cgi.FieldStorage()

# Daten abrufen
site_name = form.getvalue('name')
site_url  = form.getvalue('url')

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print (<title>Beispiel CGI-Test Beispiel</title>)
print ("</head>")
print ("<body>")
print (<h2>%s offizielle Website: %s</h2> % (site_name, site_url))
print ("</body>")
print ("</html>")

Das Folgende ist ein Formular, das die POST-Methode (method="post") verwendet, um Daten an das Server-Skript hello_get.py zu übermitteln:

Beispiel

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Beispiel (example.com)</title>
</head>
<body>
<form action="/cgi-bin/hello_get.py" method="post">
Seitenname:<input type="text" name="name">  <br />

Seiten-URL:<input type="text" name="url" />
<input type="submit" value=Absenden />
</Form>
</body>
</html>
</Form>

GIF-Demo ist wie unten gezeigt:

Übermitteln von Checkbox-Daten über ein CGI-Programm

Ein Kontrollkästchen wird verwendet, um eine oder mehrere Optionen zu übermitteln. Der HTML-Code ist wie folgt:

Beispiel

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Beispiel (example.com)</title>
</head>
<body>
<form action="/cgi-bin/checkbox.py" method="POST" target="_blank">
<input type="checkbox" name="example" value="on" />Beispiel
<input type="checkbox" name="google" value="on" /> Google
<input type="submit" value=Website auswählen />
</Form>
</body>
</html>

Das Folgende ist der Code der Datei checkbox.py:

Beispiel

#!/usr/bin/python3

# CGI-Verarbeitungsmodul importieren
import cgi, cgitb

# Eine Instanz von FieldStorage erstellen
form = cgi.FieldStorage()

# Felddaten empfangen
if form.getvalue('google'):
   google_flag = Ja
else:
   google_flag = Nein

if form.getvalue('example'):
   example_flag = Ja
else:
   example_flag = Nein

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print (<title>Beispiel CGI-Test Beispiel</title>)
print ("</head>")
print ("<body>")
print (<h2> Ob Beispiel ausgewählt ist: %s</h2> % example_flag)
print (<h2> Ob Google ausgewählt ist: %s</h2> % google_flag)
print ("</body>")
print ("</html>")

Ändern Sie die Berechtigung von checkbox.py:

chmod 755 checkbox.py

GIF-Demo für Browser-Zugriff:

Übermitteln von Radiobutton-Daten über ein CGI-Programm

Ein Radio-Button sendet nur ein Datenelement an den Server. Der HTML-Code lautet wie folgt:

Beispiel

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Beispiel (example.com)</title>
</head>
<body>
<form action="/cgi-bin/radiobutton.py" method="post" target="_blank">
<input type="radio" name="site" value="example" />Beispiel
<input type="radio" name="site" value="google" /> Google
<input type="submit" value=Absenden />
</Form>
</body>
</html>

Der Skriptcode von radiobutton.py lautet wie folgt:

Beispiel

#!/usr/bin/python3

# CGI-Verarbeitungsmodul importieren
import cgi, cgitb

# Eine Instanz von FieldStorage erstellen
form = cgi.FieldStorage()

# Felddaten empfangen
if form.getvalue('site'):
   site = form.getvalue('site')
else:
   site = Übermittelte Daten sind leer

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print (<title>Beispiel CGI-Test Beispiel</title>)
print ("</head>")
print ("<body>")
print (<h2> Die ausgewählte Website ist %s</h2> % site)
print ("</body>")
print ("</html>")

Ändern Sie die Berechtigung von radiobutton.py:

chmod 755 radiobutton.py

GIF-Demo für Browser-Zugriff:

Übermitteln von Textarea-Daten über ein CGI-Programm

Textarea sendet mehrzeilige Daten an den Server. Der HTML-Code lautet wie folgt:

Beispiel

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Beispiel (example.com)</title>
</head>
<body>
<form action="/cgi-bin/textarea.py" method="post" target="_blank">
<textarea name="textcontent" cols="40" rows="4">
Inhalt hier eingeben...
</textarea>
<input type="submit" value=Absenden />
</Form>
</body>
</html>

Der Skriptcode von textarea.py lautet wie folgt:

Beispiel

#!/usr/bin/python3

# CGI-Verarbeitungsmodul importieren
import cgi, cgitb

# Eine Instanz von FieldStorage erstellen
form = cgi.FieldStorage()

# Felddaten empfangen
if form.getvalue('textcontent'):
   text_content = form.getvalue('textcontent')
else:
   text_content = Kein Inhalt

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print (<title>Beispiel CGI-Test Beispiel</title>)
print ("</head>")
print ("<body>")
print (<h2> Die Eingabe ist: %s</h2> % text_content)
print ("</body>")
print ("</html>")
>

Berechtigung von textarea.py ändern:

chmod 755 textarea.py

GIF-Demo für Browser-Zugriff:

Übergeben von Dropdown-Daten über ein CGI-Programm.

Der Code für das HTML-Dropdown-Feld lautet wie folgt:

Beispiel

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Beispiel (example.com)</title>
</head>
<body>
<form action="/cgi-bin/dropdown.py" method="post" target="_blank">
<select name="dropdown">
<option value="example" selected>Beispiel</option>
<option value="google">Google</option>
</select>
<input type="submit" value=Absenden/>
</Form>
</body>
</html>

Der Skriptcode von dropdown.py lautet wie folgt:

Beispiel

#!/usr/bin/python3

# CGI-Verarbeitungsmodul importieren
import cgi, cgitb

# Eine Instanz von FieldStorage erstellen
form = cgi.FieldStorage()

# Felddaten empfangen
if form.getvalue('dropdown'):
   dropdown_value = form.getvalue('dropdown')
else:
   dropdown_value = Kein Inhalt

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print (<title>Beispiel CGI-Test Beispiel</title>)
print ("</head>")
print ("<body>")
print (<h2> Die ausgewählte Option ist: %s</h2> % dropdown_value)
print ("</body>")
print ("</html>")

Ändern Sie die Berechtigung von dropdown.py:

chmod 755 dropdown.py

GIF-Demo für Browser-Zugriff:


Verwendung von Cookies in CGI

Ein großer Nachteil des HTTP-Protokolls besteht darin, dass es die Identität des Benutzers nicht bestimmt, was für Programmierer eine große Unannehmlichkeit darstellt. Das Aufkommen der Cookie-Funktion gleicht diesen Mangel aus.

Ein Cookie schreibt Datensatzdaten über den Browser des Clients auf die Festplatte des Clients, während der Client auf ein Skript zugreift. Wenn der Client das nächste Mal auf das Skript zugreift, werden die Dateninformationen abgerufen, wodurch die Funktion der Identitätsunterscheidung erreicht wird. Cookies werden häufig zur Identitätsüberprüfung verwendet.

 

Cookie-Syntax

HTTP-Cookies werden über den HTTP-Header gesendet, der der Dateiübertragung vorausgeht. Die Syntax des Set-Cookie-Headers lautet wie folgt:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name=name:Der Wert des Cookies muss festgelegt werden (der Name darf nicht ";und,Zeichen verwenden), wenn es mehrere Namenswerte gibt, verwenden Sie;; zur Trennung, zum Beispiel:name1=name1;name2=name2;name3=name3。
  • expires=date:Gültigkeitsdauer des Cookies, Format: expires="Wdy,DD-Mon-YYYY HH:MM:SS"
  • path=path: Legt den vom Cookie unterstützten Pfad fest. Wenn path ein Verzeichnis ist, gilt das Cookie für alle Dateien und Unterverzeichnisse unter diesem Verzeichnis, zum Beispiel: path="/cgi-bin/". Wenn path eine Datei ist, gilt das Cookie nur für diese Datei, zum Beispiel: path="/cgi-bin/cookie.cgi".
  • domain=domain:Die Domain, für die das Cookie gültig ist, zum Beispiel: domain="www.example.com"
  • secure:Wenn dieses Flag gesetzt ist, bedeutet das, dass das Cookie nur über einen HTTPS-Server unter Verwendung des SSL-Protokolls übertragen werden kann.
  • Der Cookie-Empfang wird durch Setzen der Umgebungsvariablen HTTP_COOKIE erreicht. CGI-Programme können Cookie-Informationen durch Abfragen dieser Variablen erhalten.

Cookies setzen

Das Setzen von Cookies ist sehr einfach. Cookies werden separat im HTTP-Header gesendet. Das folgende Beispiel setzt name und expires im Cookie:

Beispiel

#!/usr/bin/python3

print ('Set-Cookie: name="Example";expires=Wed, 28 Aug 2016 18:30:00 GMT')
print ('Content-Type: text/html')

print ()
print ("""
<html>
  <head>
    <meta charset="utf-8">
<title>Beispiel (example.com)</title>
  </head>
    <body>
        <h1>Cookie erfolgreich gesetzt!</h1>
    </body>
</html>
"""
)

Speichern Sie den obigen Code in cookie_set.py und ändern Sie die Berechtigung von cookie_set.py:

chmod 755 cookie_set.py

Das obige Beispiel verwendet die Set-Cookie-Header-Informationen, um Cookie-Informationen zu setzen. Die optionalen Elemente legen andere Cookie-Attribute fest, wie Ablaufzeit Expires, Domain Domain, Pfad Path. Diese Informationen werden gesetzt"Content-type:text/html"before.


Abrufen von Cookie-Informationen

Das Abrufen von Cookie-Informationen ist sehr einfach. Die Cookie-Informationen werden in der CGI-Umgebungsvariablen HTTP_COOKIE gespeichert. Das Speicherformat ist wie folgt:

key1=value1;key2=value2;key3=value3....

Das folgende ist ein einfaches CGI-Programm zum Abrufen von Cookie-Informationen:

Beispiel

#!/usr/bin/python3

# Modul importieren
import os
import http.cookies

print ("Content-type: text/html")
print ()

print ("""
<html>
<head>
<meta charset="utf-8">
<title>Beispiel-Tutorial (example.com)</title>
</head>
<body>
<h1>Cookie-Informationen lesen</h1>
"""
)

if 'HTTP_COOKIE' in os.environ:
    cookie_string=os.environ.get('HTTP_COOKIE')
    c= http.cookies.SimpleCookie()
   # c=Cookie.SimpleCookie()
    c.load(cookie_string)

    try:
        data=c['name'].value
        print ("Cookie-Daten: "+data+"<br>")
    except KeyError:
        print ("Cookie nicht gesetzt oder abgelaufen<br>")
print ("""
</body>
</html>
"""
)

Speichern Sie den obigen Code in cookie_get.py und ändern Sie die Berechtigungen von cookie_get.py:

chmod 755 cookie_get.py

Das GIF, das die obige Cookie-Einstellung demonstriert, ist wie folgt:

Beispiel für Dateiupload

HTML-Formulare zum Hochladen von Dateien müssenenctypedas Attribut aufmultipart/form-datasetzen, der Code lautet wie folgt:

Beispiel

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Beispiel-Tutorial (example.com)</title>
</head>
<body>
 <form enctype="multipart/form-data"
                    action="/cgi-bin/save_file.py" method="post">
   <p>Datei auswählen:<input type="file" name="filename" /></p>
   <p><input type="submit" value="Hochladen" /></p>
   </Form>
</body>
</html>

Der Code für die Skriptdatei save_file.py lautet wie folgt:

Beispiel

#!/usr/bin/python3

import cgi, os
import cgitb; cgitb.enable()

form = cgi.FieldStorage()

# Dateinamen abrufen
fileitem = form['filename']

# Überprüfen, ob die Datei hochgeladen wurde
if fileitem.filename:
   # Dateipfad festlegen
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + fn, 'wb').write(fileitem.file.read())

   message = 'Datei "' + fn + '" erfolgreich hochgeladen'
   
else:
   message = 'Datei nicht hochgeladen'
   
print ("""\
Content-Type: text/html\n
<html>
<head>
<meta charset="utf-8">
<title>Beispiel-Tutorial (example.com)</title>
</head>
<body>
   <p>%s</p>
</body>
</html>
"""
% (message,))

Speichern Sie den obigen Code in save_file.py und ändern Sie die Berechtigungen von save_file.py:

chmod 755 save_file.py

Das GIF, das die obige Cookie-Einstellung demonstriert, ist wie folgt:

Wenn Ihr System Unix/Linux ist, müssen Sie das Dateitrennzeichen ersetzen; unter Windows müssen Sie nur die open()-Anweisung verwenden:

fn = os.path.basename(fileitem.filename.replace("\\", "/" ))

Dateidownload-Dialog

Erstellen Sie zuerst eine foo.txt-Datei im aktuellen Verzeichnis, damit das Programm sie herunterladen kann.

Der Dateidownload wird durch Festlegen von HTTP-Header-Informationen implementiert. Der funktionale Code lautet wie folgt:

Beispiel

#!/usr/bin/python3

# HTTP-Header
print ("Content-Disposition: attachment; filename=\"foo.txt\"")
print ()
# Datei öffnen
fo = open("foo.txt", "rb")

str = fo.read();
print (str)

# Datei schließen
fo.close()
Weitere Erweiterungen