Latest web development tutorials

Python CGI-Programmierung

Was ist CGI

CGI derzeit verwaltet von NCSA, NCSA CGI ist wie folgt definiert:

CGI (Common Gateway Interface), Common Gateway Interface, das ein Programm auf dem Server ausgeführt wird, wie zum Beispiel: HTTP-Server, die Client-Schnittstelle die gleiche HTML-Seite bereitstellt.


Web-Browsing

Um besser zu verstehen, wie CGI funktioniert, können wir auf einen Link klicken Sie auf einer Webseite oder URL des Prozesses:

  • 1, verwenden Sie Ihren Browser auf die URL zugreifen und an den HTTP-Web-Server verbinden.
  • 2, Web-Server empfängt die Anforderungsnachricht URL analysiert werden und der Zugriff auf Dateien auf dem Server aussehen, wenn es, wenn es um den Inhalt der Datei zurück, sonst wird es eine Fehlermeldung zurück.
  • 3 empfängt der Browser die Informationen von dem Server und zeigt die empfangene Datei oder Fehlermeldungen.

CGI-Programme können ein Python-Skript, PERL-Skript, Shell-Skript, C oder C ++ Programme sein.


CGI-Diagramm

cgiarch


Web-Server-Konfiguration und Support

Bevor Sie die CGI-Programmierung durchführen, stellen Sie sicher, dass Ihr Webserver konfiguriert wurde CGI und CGI-Handler zu unterstützen.

Apache unterstützt CGI-Konfiguration:

Stellen Sie das CGI-Verzeichnis auf:

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

Alle HTTP-Server CGI-Programme auszuführen, werden in einem vorkonfigurierten Verzeichnis gespeichert. Dieses Verzeichnis ist das CGI-Verzeichnis genannt, und durch Konvention, es heißt / var / www / cgi-bin-Verzeichnis.

CGI Dateierweiterung .cgi kann Python auch die Py-Erweiterung verwenden.

Standardmäßig Linux-Server-Konfiguration cgi-bin-Verzeichnis ausgeführt wird, ist / var / www.

Wenn Sie ein anderes Verzeichnis angeben möchten, CGI-Skripte ausführen, 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>

In Py Suffix AddHandler, so können wir das Ende Py Python-Skript-Datei zugreifen:

AddHandler cgi-script .cgi .pl .py

Das erste CGI-Programm

Wir Python verwenden, um die erste CGI-Programm zu erstellen hello.py genannt, wird die Datei in / var / www / cgi-bin-Verzeichnis befinden, wie folgt:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

print "Content-type:text/html"
print                               # 空行,告诉服务器结束头部
print '<html>'
print '<head>'
print '<meta charset="utf-8">'
print '<title>Hello Word - 我的第一个 CGI 程序!</title>'
print '</head>'
print '<body>'
print '<h2>Hello Word! 我是来自本教程的第一CGI程序</h2>'
print '</body>'
print '</html>'

Nachdem Sie die Datei Änderung hello.py speichern, ändern Sie die Dateiberechtigungen auf 755:

chmod 755 hello.py 

Das obige Programm wird im Browser angezeigt, die Ergebnisse für den Zugriff sind wie folgt:

Das hello.py dieses Skript ist ein einfaches Python-Skript, das Skript von der ersten Ausgangsleitung "Content-type: text / html" an den Browser-Typ zu senden und zu dem Browser mitteilen, den Inhalt als "text / html" anzuzeigen.

Die Druckausgabe mit einer Leerzeile wird verwendet, um den Server Ende der Header-Informationen zu erzählen.


HTTP-Header

hello.py Dateiinhalt in: Teil des HTTP-Header "Content-Type text / html", wird sie an den Browser Inhaltstyp gesendet werden erzählt die Browser-Dateien.

HTTP-Header-Format ist wie folgt:

HTTP 字段名: 字段内容

Zum Beispiel:

Content-type: text/html

Die folgende Tabelle beschreibt die Informationen in den HTTP-Header CGI-Programme werden häufig verwendet:

Kopf Beschreibung
Content-type: MIME-Einheit an die Informationsanforderung entspricht. Zum Beispiel: Content-type: text / html
Gültig bis: Datum Antwort Datum und Zeit abgelaufen
Standort: URL Um den Empfänger in einen nicht-location URL Anfrage umleiten die Anfrage oder die Identifizierung neuer Ressourcen zu vervollständigen
Last-Modified: Datum Die angeforderte Ressource wurde zuletzt geändert
Content-length: N Content-Length-Anfrage
Set-Cookie: String Http Cookie-Einstellungen

CGI-Umgebungsvariablen

Alle CGI-Programme haben die folgenden Umgebungsvariablen erhalten, die eine wichtige Rolle in der CGI-Programm gespielt:

Variablenname Beschreibung
CONTENT_TYPE Dieser Wert zeigt an, dass die Umgebungsvariable auf den MIME-Typ der Informationsübertragung. Derzeit sind die Umgebungsvariablen im Allgemeinen CONTENT_TYPE: application / x-www-form-urlencoded, sagte er, dass die Daten aus dem HTML-Formular.
CONTENT_LENGTH Wenn der Übertragungsmodus-Server und CGI-Programminformationen POST, selbst wenn die Umgebungsvariable STDIN Eingabe der Anzahl von Bytes, die gültige Daten aus dem Standard gelesen werden kann. Diese Umgebungsvariable, wenn die Eingabedaten Lesen verwendet werden.
HTTP_COOKIE COOKIE Inhalt innerhalb des Client.
HTTP_USER_AGENT Die Bereitstellung von Informationen enthält die Versionsnummer der Client-Browser oder andere urheberrechtlich geschützte Daten.
PATH_INFO Der Wert dieser Umgebungsvariable gibt den Namen des CGI-Programms unmittelbar nach dem zusätzlichen Pfadinformationen. Oft scheint es, als Argument CGI-Programm.
QUERY_STRING Wenn der Übertragungsmodus-Server und CGI-Programminformationen Informationen zu erhalten, um den Wert dieser Umgebungsvariablen selbst wenn weitergegeben. Diese Information wird durch den Namen des CGI-Programms, die beide in der Mitte mit einem Fragezeichen "?" Separator gefolgt.
REMOTE_ADDR Der Wert dieser Umgebungsvariablen ist die IP-Adresse des Client eine Anfrage sendet, beispielsweise die oben 192.168.1.67. Dieser Wert ist immer vorhanden. Und es ist die Notwendigkeit der Web-Client auf dem Webserver die eindeutige Kennung zu schaffen, in CGI-Programmen verwendet werden, um zwischen verschiedenen Web-Client zu unterscheiden.
REMOTE_HOST Der Wert dieser Umgebungsvariable enthält den Host-Namen des anfordernden Clients von CGI. Wenn es Sie nicht überprüfen möchten, brauchen Sie nicht diese Umgebungsvariable zu definieren.
REQUEST_METHOD Es stellt eine Methode namens Skript. Für HTTP / 1.0-Protokoll-Skript nur GET und POST sinnvoll.
SCRIPT_FILENAME Der vollständige Pfad zum CGI-Skripten
SCRIPT_NAME Der Name des CGI-Skript
SERVER_NAME Dies ist der Hostname, Alias ​​oder IP-Adresse Ihres Web-Server.
SERVER_SOFTWARE Der Wert dieser Umgebungsvariable enthält den Aufruf CGI Programmnamen und die Versionsnummer des HTTP-Servers. Zum Beispiel kann der obige Wert von Apache / 2.2.14 (Unix)

Hier ist ein einfaches CGI-Skript-Ausgabe CGI-Umgebungsvariablen:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# filename:test.py

import os

print "Content-type: text/html"
print
print "<meta charset=\"utf-8\">"
print "<b>环境变量</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 die oben genannten Punkte test.py, und ändern Sie die Dateiberechtigungen auf 755, die Ausführungsergebnisse sind wie folgt:


GET und POST-Methoden

Browser-Client zum Server-Informationen auf zwei Arten zu liefern, von denen beide Verfahren Methoden GET und POST ist.

Verwenden Sie die GET-Methode zur Übertragung von Daten

GET Methode, um die codierten Benutzerinformationen an den Server zu senden, unterteilt die Dateninformationen in der URL der Seite Anfrage Nummer enthalten ist, wie folgt "?":

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
GET-Anfragen über einige der anderen Kommentare:
  • GET Anfrage können zwischengespeichert werden
  • GET-Anforderung bleibt in der Browser-History
  • GET-Anfragen können Lesezeichen gespeichert werden
  • GET-Anforderungen sollten nicht verwendet werden, wenn sie mit sensiblen Daten zu tun
  • GET-Anforderungen haben Längenbeschränkungen
  • GET-Anfragen sollten nur verwendet werden, um Daten abzurufen

Beispiele für einfache url: Methode GET

Im Folgenden ist eine einfache URL, GET-Methode unter Verwendung von zwei Parametern zu senden Programm hello_get.py:

/cgi-bin/test.py?name=本教程&url=http://www.w3big.com

Ein Code hello_get.py Datei:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# filename:test.py

# CGI处理模块
import cgi, cgitb 

# 创建 FieldStorage 的实例化
form = cgi.FieldStorage() 

# 获取数据
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>本教程 CGI 测试实例</title>"
print "</head>"
print "<body>"
print "<h2>%s官网:%s</h2>" % (site_name, site_url)
print "</body>"
print "</html>"

Nachdem Sie die Datei Änderung hello_get.py speichern, ändern Sie die Dateiberechtigungen auf 755:

chmod 755 hello_get.py 

Browser-Anforderungen Ausgabe:

Beispiele für einfache Form: Methode GET

Es folgt eine zwei Daten senden an den Server der GET-Methode über ein HTML-Formular verwenden, eingereicht denselben Server-Skript hello_get.py Datei ist hello_get.html Code wie folgt:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/hello_get.py" method="get">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

Standardmäßig kann das Verzeichnis cgi-bin nur eine Skriptdatei speichern, werden wir unter dem Testverzeichnis sein, ändern Sie die Dateiberechtigungen als 755 gespeichert hello_get.html:

chmod 755 hello_get.html

Gif-Präsentation ist wie folgt:

Verwenden Sie die POST-Methode Daten zu übergeben

Mit Hilfe der POST-Methode übergeben Daten an den Server sicherer und zuverlässiger, da einige sensible Daten wie Benutzerkennwörter POST verwenden müssen, ist es, Daten zu übertragen.

Hier finden Sie auch hello_get.py, kann es auch durch den Browser übermittelt POST Formulardaten verarbeiten:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# CGI处理模块
import cgi, cgitb 

# 创建 FieldStorage 的实例化
form = cgi.FieldStorage() 

# 获取数据
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>本教程 CGI 测试实例</title>"
print "</head>"
print "<body>"
print "<h2>%s官网:%s</h2>" % (site_name, site_url)
print "</body>"
print "</html>"

Nachfolgend finden Sie eine Formulardaten an den Server - Skript hello_get.py durch POST - Methode (method = "post") einreichen:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/hello_get.py" method="post">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

Gif-Präsentation ist wie folgt:

CGI-Programm für die Datenübertragung durch das Kontrollkästchen

Checkbox, die eine oder mehrere Optionsdaten vorzulegen, ist HTML-Code wie folgt:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/checkbox.py" method="POST" target="_blank">
<input type="checkbox" name="w3big" value="on" /> 本教程
<input type="checkbox" name="google" value="on" /> Google
<input type="submit" value="选择站点" />
</form>
</body>
</html>

Ein Code checkbox.py Datei:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 引入 CGI 处理模块 
import cgi, cgitb 

# 创建 FieldStorage的实例 
form = cgi.FieldStorage() 

# 接收字段数据
if form.getvalue('google'):
   google_flag = "是"
else:
   google_flag = "否"

if form.getvalue('w3big'):
   w3big_flag = "是"
else:
   w3big_flag = "否"

print "Content-type:text/html"
print
print "<html>"
print "<head>"
print "<meta charset=\"utf-8\">"
print "<title>本教程 CGI 测试实例</title>"
print "</head>"
print "<body>"
print "<h2> 本教程是否选择了 : %s</h2>" % w3big_flag
print "<h2> Google 是否选择了 : %s</h2>" % google_flag
print "</body>"
print "</html>"

Ändern checkbox.py Berechtigungen:

chmod 755 checkbox.py

Browser-Zugriff Gif Präsentations-Charts:

Funkdatenübertragung via CGI-Programm

Nur Radio übertragen Daten an einen Server, HTML-Code ist wie folgt:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/radiobutton.py" method="post" target="_blank">
<input type="radio" name="site" value="w3big" /> 本教程
<input type="radio" name="site" value="google" /> Google
<input type="submit" value="提交" />
</form>
</body>
</html>

radiobutton.py Script-Code ist wie folgt:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 引入 CGI 处理模块 
import cgi, cgitb 

# 创建 FieldStorage的实例 
form = cgi.FieldStorage() 

# 接收字段数据
if form.getvalue('site'):
   site = form.getvalue('site')
else:
   site = "提交数据为空"

print "Content-type:text/html"
print
print "<html>"
print "<head>"
print "<meta charset=\"utf-8\">"
print "<title>本教程 CGI 测试实例</title>"
print "</head>"
print "<body>"
print "<h2> 选中的网站是 %s</h2>" % site
print "</body>"
print "</html>"

Ändern radiobutton.py Berechtigungen:

chmod 755 radiobutton.py

Browser-Zugriff Gif Präsentations-Charts:

Textarea Übertragung von Daten via CGI-Programm

TextArea- Pass mehrere Reihen von Daten an den Server ist HTML Code wie folgt:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/textarea.py" method="post" target="_blank">
<textarea name="textcontent" cols="40" rows="4">
在这里输入内容...
</textarea>
<input type="submit" value="提交" />
</form>
</body>
</html>

textarea.py Script-Code ist wie folgt:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 引入 CGI 处理模块 
import cgi, cgitb 

# 创建 FieldStorage的实例 
form = cgi.FieldStorage() 

# 接收字段数据
if form.getvalue('textcontent'):
   text_content = form.getvalue('textcontent')
else:
   text_content = "没有内容"

print "Content-type:text/html"
print
print "<html>"
print "<head>";
print "<meta charset=\"utf-8\">"
print "<title>本教程 CGI 测试实例</title>"
print "</head>"
print "<body>"
print "<h2> 输入的内容是:%s</h2>" % text_content
print "</body>"
print "</html>"

Ändern textarea.py Berechtigungen:

chmod 755 textarea.py

Browser-Zugriff Gif Präsentations-Charts:

Drop-Down-Pass-Daten über das CGI-Programm.

HTML Dropdown-Feld Code wie folgt:

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

dropdown.py Script-Code wie folgt:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 引入 CGI 处理模块 
import cgi, cgitb 

# 创建 FieldStorage的实例 
form = cgi.FieldStorage() 

# 接收字段数据
if form.getvalue('dropdown'):
   dropdown_value = form.getvalue('dropdown')
else:
   dropdown_value = "没有内容"

print "Content-type:text/html"
print
print "<html>"
print "<head>"
print "<meta charset=\"utf-8\">"
print "<title>本教程 CGI 测试实例</title>"
print "</head>"
print "<body>"
print "<h2> 选中的选项是:%s</h2>" % dropdown_value
print "</body>"
print "</html>"

Ändern dropdown.py Berechtigungen:

chmod 755 dropdown.py

Browser-Zugriff Gif Präsentations-Charts:


CGI wird genutzt, Plätzchen

Http-Protokoll in einem großen Nachteil ist falsch die Identität eines Benutzers zu beurteilen, die Programmierer viel Unannehmlichkeiten geben, scheint aber die Cookie-Funktion für diesen Mangel besteht.

Cookie, das das Skript, während der Kunde durch den Browser des Kunden auf dem Client-Festplatte zugreift, um Datensätze zu schreiben, Daten abrufen, wenn ein Kunde das nächste Skript besucht, um die Funktion der Bestimmung der Identität zu erreichen, Cookie bei der Überprüfung der Identität verwendet.

Cookie-Syntax

Http-Cookie wird durch den HTTP-Header gesendet zu erreichen, hatte er die Übertragung von Dateien, Header-Set-Cookie-Syntax lautet wie folgt:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name = Name: den Wert des Cookie zu setzen (Name nicht verwendet werden kann "," und "," Nummer), wenn es mehrere Namen Werte sind ";" zu trennen, zum Beispiel: name1 = name1, name2 = name2 ; name3 = name3.
  • Ablauf = Datum: Cookie Ablaufdatum im Format: abläuft = "WDY, DD- Mo-YYYY HH: MM: SS"
  • path = Pfad: der Pfad gesetzt Cookie - Unterstützung, wenn der Weg ist ein Weg, das Cookie für alle Dateien und Unterverzeichnisse des Verzeichnisses Inkrafttreten, zum Beispiel: path = "/ cgi-bin /", wenn der Pfad ist eine Datei, Cookie er bezieht sich auf das Inkrafttreten dieser Datei, zum Beispiel: path = "/ cgi-bin / cookie.cgi".
  • domain = Domain: der Domain - Name des Cookies gültig ist , zum Beispiel: domain = "www.w3big.com"
  • sichern: Wenn dieses Flag gegeben wird , dass das Cookie kann nur durch das SSL - Protokoll HTTPS - Server übertragen werden.
  • Cookie wird durch das Setzen von Umgebungsvariablen HTTP_COOKIE erreicht, CGI-Programme empfangenen Informationen durch Abfrage der Cookie-Variable erhalten.

Cookie-Einstellungen

Cookie-Einstellungen ist sehr einfach, Cookie wird separat unter http-Header gesendet. Im folgenden Beispiel wird der Name und endet in einem Cookie:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 
print 'Content-Type: text/html'
print 'Set-Cookie: name="本教程";expires=Wed, 28 Aug 2016 18:30:00 GMT'
print
print """
<html>
	<head>
		<meta charset="utf-8">
		<title>本教程(w3big.com)</title>
	</head>
    <body>
        <h1>Cookie set OK!</h1>
    </body>
</html>
"""

Speichern Sie den Code oben zu cookie_set.py und ändern cookie_set.py Berechtigungen:

chmod 755 cookie_set.py

Die obigen Beispiele zeigen die Set-Cookie-Header verwenden, um die Cookie-Informationen zum Festlegen von Optionen zu Cookies andere Attribute, wie das Ablaufzeit abgelaufen ist, Domain-Domain, Pfad Pfad. Diese Informationen werden zur Verfügung gestellt: Vor dem "Content-Type text / html".


Abrufen von Informationen zu Cookies

Cookie-Information-Retrieval-Seite ist sehr einfach, in der CGI-Umgebungsvariablen HTTP_COOKIE, das Speicherformat ist wie folgt Cookie-Informationen gespeichert sind:

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

Hier ist ein einfaches CGI-Programm zu Cookie-Informationen abrufen:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 导入模块
import os
import Cookie

print "Content-type: text/html"
print

print """
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<h1>读取cookie信息</h1>
"""

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

    try:
        data=c['name'].value
        print "cookie data: "+data+"<br>"
    except KeyError:
        print "cookie 没有设置或者已过去<br>"
print """
</body>
</html>

"""

Speichern Sie den Code oben zu cookie_get.py und ändern cookie_get.py Berechtigungen:

chmod 755 cookie_get.py

Mehr Farbe Gif Cookie-Einstellungen sind wie folgt:

Beispiele für das Hochladen von Dateien

HTML - Einstellungsdatei multipart / form-data, Code zu laden müssen das enctype Attribut wie folgt festzulegen:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
 <form enctype="multipart/form-data" 
                     action="/cgi-bin/save_file.py" method="post">
   <p>选中文件: <input type="file" name="filename" /></p>
   <p><input type="submit" value="上传" /></p>
   </form>
</body>
</html>

save_file.py Skriptdatei Code ist wie folgt:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

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

form = cgi.FieldStorage()

# 获取文件名
fileitem = form['filename']

# 检测文件是否上传
if fileitem.filename:
   # 设置文件路径 
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + fn, 'wb').write(fileitem.file.read())

   message = '文件 "' + fn + '" 上传成功'
   
else:
   message = '文件没有上传'
   
print """\
Content-Type: text/html\n
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
   <p>%s</p>
</body>
</html>
""" % (message,)

Speichern Sie den Code oben zu save_file.py und ändern save_file.py Berechtigungen:

chmod 755 save_file.py

Mehr Farbe Gif Cookie-Einstellungen sind wie folgt:

Wenn Sie Unix / Linux verwenden, müssen Sie die Datei Separator im Fenster ersetzen nur open () Anweisung sein kann verwenden müssen:

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

Dialogfeld Dateidownload

Wir schaffen foo.txt Datei im aktuellen Verzeichnis, das Programm zum Download bereit.

Laden Sie die Datei, indem Sie den HTTP-Header-Informationen Einstellung der Funktionscode zu implementieren, ist wie folgt:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# HTTP 头部
print "Content-Disposition: attachment; filename=\"foo.txt\"";
print
# 打开文件
fo = open("foo.txt", "rb")

str = fo.read();
print str

# 关闭文件
fo.close()