Latest web development tutorials

Programowanie CGI Pythona

Co to jest CGI

CGI jest utrzymywane przez NCSA NCSA CGI jest zdefiniowany w następujący sposób:

CGI (Common Gateway Interface), Common Gateway Interface, który to program uruchomiony na serwerze, na przykład: Serwer HTTP, interfejs kliencki z tej samej strony HTML.


przeglądanie stron internetowych

Aby lepiej zrozumieć, jak działa CGI, możemy kliknąć na link na stronie internetowej lub adresu URL procesu:

  • 1, należy użyć przeglądarki, aby uzyskać dostęp do adresu URL i podłączyć do serwera HTTP.
  • 2, serwer sieci Web odbiera komunikat żądania będą przetwarzane URL i wyszukać pliki dostępne na serwerze, jeśli istnieje, jeśli istnieje, aby przywrócić zawartość pliku, w przeciwnym wypadku zwraca komunikat o błędzie.
  • 3, przeglądarka otrzymuje informacje z serwera i wyświetla otrzymane wiadomości plików lub błędów.

Programy CGI może być skrypt Python, Perl skrypt, skrypt powłoki, C lub C ++ programy.


Wykres CGI

cgiarch


Konfiguracja serwera WWW i wsparcie

Przed przeprowadzić programowanie CGI, upewnij się, że serwer WWW został skonfigurowany do obsługi CGI oraz obsługi CGI.

Apache obsługuje konfigurację CGI:

Konfigurowanie katalogu CGI:

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

Wszystkie serwer HTTP w celu wykonania programów CGI są zapisywane we wstępnie skonfigurowane katalogu. Ten katalog jest nazywany katalogu CGI, a zgodnie z przyjętą konwencją, to nazywa się w katalogu / var / www / cgi-bin.

Plik CGI rozszerzenie .cgi, python można również użyć rozszerzenie .py.

Domyślnie konfiguracja serwera Linux działa katalogu cgi-bin jest / var / www.

Jeśli chcesz określić inny katalog do uruchamiania skryptów CGI, można zmodyfikować plik konfiguracyjny httpd.conf w następujący sposób:

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

Dodaj przyrostek .py AddHandler, dzięki czemu możemy uzyskać dostępu do pliku skryptowego Python koniec .py:

AddHandler cgi-script .cgi .pl .py

Pierwszy program CGI

Używamy Pythona do utworzenia pierwszego programu CGI o nazwie hello.py, plik znajduje się w katalogu / var / www katalogu / cgi-bin, co następuje:

#!/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>'

Po zapisaniu modyfikacji pliku hello.py, zmodyfikować uprawnienia plików do 755:

chmod 755 hello.py 

Powyższy program jest wyświetlana w przeglądarce dostępu wyniki przedstawiają się następująco:

Hello.py ten skrypt jest prosty skrypt w Pythonie, skrypt pierwszej linii wyjście "Content-Type: text / html", aby wysłać do rodzaju przeglądarki i poinformować przeglądarkę, aby wyświetlić zawartość jako "text / html".

wydruk z pustą linią służy powiedzieć koniec serwera informacji nagłówka.


nagłówek HTTP

hello.py zawartość pliku w: część nagłówka HTTP jest "Content-type text / html", zostanie ona wysłana do typu zawartości przeglądarka informuje pliki przeglądarki.

Format nagłówek HTTP jest następujący:

HTTP 字段名: 字段内容

Na przykład:

Content-type: text/html

Poniższa tabela przedstawia informacje w programach CGI nagłówka HTTP są często używane:

głowa opis
Content-type: Podmiot MIME odpowiadające żądanie informacji. Na przykład: Content-Type: text / html
Wygasa: Data data i czas reakcji wygasł
Lokalizacja: URL Aby przekierować odbiorcę na żądanie zakaz lokalizacji URL o uzupełnienie wniosku lub identyfikacji nowych zasobów
Last modified: Data Żądany zasób został ostatnio modyfikowany
Content-Length: N Żądanie Content-Length
Set-Cookie: String Ustawienia HTTP Cookie

Zmienne środowiskowe CGI

Wszystkie programy CGI otrzymały następujące zmienne środowiskowe, które odegrały ważną rolę w programie CGI:

Nazwa zmiennej opis
CONTENT_TYPE Wartość ta wskazuje, że zmiennej środowiskowej do typu MIME przekazywania informacji. Obecnie, zmienne środowiskowe są zwykle CONTENT_TYPE: application / x-www-form-urlencoded, powiedział, że dane z formularza HTML.
CONTENT_LENGTH Jeśli informacje Serwer tryb transferu i program CGI jest POST, nawet jeśli zmienna środowiskowa wejścia STDIN liczba bajtów, które można odczytać aktualne dane z normą. Ta zmienna podczas odczytu danych wejściowych muszą być użyte.
HTTP_COOKIE Zawartość COOKIE w kliencie.
HTTP_USER_AGENT Dostarczanie informacji zawiera numer wersji przeglądarki klienta lub innych poufnych danych.
PATH_INFO Wartość tej zmiennej środowiskowej wskazuje nazwę programu CGI natychmiast po informacji dodatkowej ścieżki. często pojawia się on jako program CGI argumentem.
QUERY_STRING Jeśli informacje Serwer tryb transferu i program CGI jest informacja GET, wartość tej zmiennej środowiskowej nawet jeśli minął. Informacje te są następnie nazwę programu CGI, zarówno w środku ze znakiem zapytania "?" Separatora.
REMOTE_ADDR Wartość tej zmiennej środowiskowej jest adres IP klienta wysyła żądanie, na przykład, powyższa 192.168.1.67. Wartość ta jest zawsze obecny. I to jest konieczność zapewnienia klient internetowy unikalnego identyfikatora serwera sieci Web mogą być wykorzystane w programach CGI odróżnić innego klienta sieci Web.
REMOTE_HOST Wartość tej zmiennej środowiskowej zawiera nazwę hosta żądającego klienta CGI. Jeśli nie chcesz, by sprawdzić, nie trzeba zdefiniować tę zmienną.
REQUEST_METHOD Zapewnia metody nazywanej skrypt. Dla scenariusza HTTP / 1.0 protokołu tylko GET i POST znaczące.
SCRIPT_FILENAME Pełna ścieżka do skryptów CGI
SCRIPT_NAME Nazwa skryptu CGI
SERVER_NAME Jest to nazwa hosta, alias lub adres IP serwera sieci Web.
SERVER_SOFTWARE Wartość tej zmiennej środowiskowej zawiera wywołanie CGI nazwę programu i numer wersji serwera HTTP. Na przykład, powyższa wartość Apache / 2.2.14 (Unix)

Oto prosty skrypt CGI zmienne środowiskowe CGI wyjście:

#!/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>"

Zapisz powyższych punktów test.py i modyfikować uprawnienia plików do 755, wyniki wykonania są następujące:


GET i POST metody

Przeglądarka klienta do serwera w celu dostarczenia informacji na dwa sposoby, z których oba metoda jest GET i metody POST.

Za pomocą metody GET przesyłania danych

GET do wysyłania zakodowanych danych użytkownika do serwera, dane informacyjne jest zawarty w adresie URL żądania strony do liczby dzielą się na "?":

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
GET wnioski dotyczące niektórych innych uwag:
  • GET Żądanie to może być buforowane
  • Żądanie GET pozostaje w historii przeglądarki
  • GET wnioski mogą być zakładka
  • GET żądania nie powinny być wykorzystywane w kontaktach z danych wrażliwych
  • GET wnioski mają ograniczenia długości
  • GET wnioski powinny być stosowane wyłącznie do pobierania danych

Przykłady prostych url: Get metody

Poniżej znajduje się prosty URL, używając metody GET wysłać dwa parametry hello_get.py programu:

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

Plik Kod hello_get.py:

#!/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>"

Po zapisaniu modyfikacji pliku hello_get.py, zmodyfikować uprawnienia plików do 755:

chmod 755 hello_get.py 

Przeglądarka żąda wyjście:

Przykłady prostej formie: Get metody

Poniżej przedstawiono dwa wysłać dane do serwera za pomocą metody GET za pośrednictwem formularza HTML, przedstawiony ten sam plik hello_get.py skryptu serwera, kod hello_get.html przedstawia się następująco:

<!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>

Domyślnie katalog cgi-bin może przechowywać plik skryptu, będziemy w katalogu testowym, należy zmodyfikować plik uprawnienia hello_get.html przechowywane jako 755:

chmod 755 hello_get.html

Gif prezentacji jest następujący:

Za pomocą metody POST, aby przekazać dane

Korzystanie z metody POST, aby przekazać dane do serwera jest bardziej bezpieczne i niezawodne, jak niektórzy poufnych informacji, takich jak hasła użytkownika należy użyć POST do przesyłania danych.

Poniżej również hello_get.py, może również obsługiwać POST dane formularzy złożonych przez przeglądarkę:

#!/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>"

Poniżej znajduje się formularz do przekazywania danych do hello_get.py skryptu serwer metodą POST (method = "post"):

<!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 prezentacji jest następujący:

Program CGI do przekazywania danych za pośrednictwem wyboru

pole wykorzystywane do przedstawienia jednego lub więcej danych opcji, HTML kod jest w następujący sposób:

<!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>

Plik Kod checkbox.py:

#!/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>"

Modyfikacja checkbox.py uprawnienia:

chmod 755 checkbox.py

Przeglądarka Dostęp Gif wykresy prezentacji:

transfer danych Radio poprzez program CGI

Radiowego przesyłania danych tylko do serwera kod HTML jest następujący:

<!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 kod skryptu jest następująca:

#!/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>"

Modyfikacja radiobutton.py uprawnienia:

chmod 755 radiobutton.py

Przeglądarka Dostęp Gif wykresy prezentacji:

textarea transferu danych przez program CGI

Textarea przekazać wiele wierszy danych do serwera, HTML kod jest w następujący sposób:

<!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 kod skryptu jest następująca:

#!/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>"

Modyfikacja uprawnień textarea.py:

chmod 755 textarea.py

Przeglądarka Dostęp Gif wykresy prezentacji:

Rozwijane dane przechodzą przez program CGI.

Kod HTML pole rozwijane w sposób następujący:

<!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 kod skryptu w następujący sposób:

#!/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>"

Modyfikacja dropdown.py uprawnienia:

chmod 755 dropdown.py

Przeglądarka Dostęp Gif wykresy prezentacji:


CGI służy Cookie

Protokół HTTP w wielkim wadą jest źle ocenić tożsamości użytkownika, które dają programistom wiele niedogodności, ale wydaje funkcjonalności cookies nadrabiał ten niedobór.

cookies, które uzyskuje dostęp do skryptu, a klient przez przeglądarkę klienta na kliencie twardym pisać rekordy danych, pobieranie danych, gdy klient odwiedza kolejny skrypt, tak aby osiągnąć funkcję określania tożsamości, ciasteczka powszechnie stosowane przy weryfikacji tożsamości.

Składnia cookies

Http cookie jest wysyłane za pośrednictwem nagłówka HTTP osiągnąć, musiał przesyłać pliki, składni header set-Cookie to w następujący sposób:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name = nazwa: ustawić wartość cookie (nazwa nie może być używany "," i "," numer), gdy istnieje wiele wartości name ";" aby oddzielić, na przykład: nazwa1 = nazwa1, nazwa2 = name2 ; NAME3 = NAME3.
  • wygasa = data: ciasteczka datę ważności w formacie: wygaśnięcia = "Wdy, DD- MMM-YYYY HH: MM: SS"
  • path = ścieżka: ścieżka ustawić obsługę ciasteczek, jeśli ścieżka jest ścieżką, cookie dla wszystkich plików i podkatalogów pozycji katalogu w życie, na przykład: path = "/ cgi-bin /", jeśli ścieżka jest plik, cookie to odnosi się do wejścia w życie tego pliku, na przykład: path = "/ cgi-bin / cookie.cgi".
  • domain = Domena: nazwa domeny cookie jest ważny, na przykład: domena = "www.w3big.com"
  • zabezpieczenie: Jeśli ta flaga jest podane, że ciasteczka mogą być przesyłane wyłącznie za pośrednictwem protokołu SSL serwera https.
  • Cookie jest odbierany przez ustawienie zmiennych środowiskowych HTTP_COOKIE osiągnięty, programy CGI mogą uzyskać informacje, pobierając zmienną cookie.

ustawienia cookies

Ustawienia cookies jest bardzo prosta, ciasteczko zostanie wysłane osobno w nagłówku HTTP. Poniższy przykład ustawia nazwę i wygasa w pliku 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>
"""

Zapisz powyższy kod do cookie_set.py i modyfikować cookie_set.py uprawnienia:

chmod 755 cookie_set.py

Powyższe przykłady użyć nagłówka Set-Cookie, aby ustawić informacje Cookie, opcje ustawione Cookie inne atrybuty, takie jak po upływie tego terminu, domeny, domeny, Ścieżka Ścieżka. Te informacje są dostarczane: Przed "Content-type text / html".


Pobieranie informacji Cookie

Cookie stronę wyszukiwania informacji jest bardzo proste, w CGI Zmienne środowiskowe HTTP_COOKIE, format przechowywania jest następująca informacja jest przechowywana Cookie:

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

Oto prosty program CGI do pobierania informacji cookie:

#!/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>

"""

Zapisz powyższy kod do cookie_get.py i modyfikować cookie_get.py uprawnienia:

chmod 755 cookie_get.py

Ustawienia cookies Gif Więcej kolorów są następujące:

Przykłady wysyłania plików

Plik HTML załadować ustawienia trzeba ustawić atrybut enctype do multipart / form-data, kod w następujący sposób:

<!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>

Kod save_file.py plik skryptu jest następująca:

#!/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,)

Zapisz powyższy kod do save_file.py i modyfikować save_file.py uprawnienia:

chmod 755 save_file.py

Ustawienia cookies Gif Więcej kolorów są następujące:

Jeśli używasz Unix / Linux, należy zastąpić separator plików w oknie wystarczy użyć open () oświadczenie może być:

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

Okno dialogowe Pobieranie pliku

Tworzymy plik foo.txt w bieżącym katalogu do pobrania programu.

Pobierz plik przez ustawienie nagłówka HTTP informacji wdrożyć kod funkcji jest następująca:

#!/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()