Latest web development tutorials

Python programmation CGI

Qu'est-ce que CGI

CGI actuellement maintenu par NCSA, NCSA CGI est défini comme suit:

CGI (Common Gateway Interface), Common Gateway Interface, qui est un programme en cours d'exécution sur le serveur, telles que: serveur HTTP, l'interface client fournissant la même page HTML.


navigation sur le Web

Pour mieux comprendre comment CGI fonctionne, on peut cliquer sur un lien sur une page Web ou URL du processus:

  • 1, utilisez votre navigateur pour accéder à l'URL et la connexion au serveur Web HTTP.
  • 2, serveur Web reçoit le message de demande sera analysée URL et regarder les fichiers disponibles sur le serveur s'il y a, si l'on veut retourner le contenu du fichier, sinon il renvoie un message d'erreur.
  • 3, le navigateur reçoit les informations du serveur et affiche les messages de fichiers ou d'erreur reçus.

Les programmes CGI peuvent être un script Python, PERL de script, le script SHELL, C ou programmes C ++.


CGI Graphique

cgiarch


configuration du serveur Web et de soutien

Avant de procéder à la programmation CGI, assurez-vous que votre serveur Web a été configuré pour soutenir CGI et gestionnaire de CGI.

Apache prend en charge la configuration de CGI:

Mettre en place le répertoire CGI:

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

Tout serveur HTTP pour exécuter des programmes CGI sont stockés dans un répertoire pré-configuré. Ce répertoire est appelé le répertoire CGI, et par convention, il est nommé var / www / / cgi-bin.

fichier CGI .cgi, python peut également utiliser l'extension .py.

Par défaut, la configuration du serveur Linux exécutant répertoire cgi-bin / var / www.

Si vous souhaitez spécifier un répertoire différent pour exécuter des scripts CGI, vous pouvez modifier le fichier de configuration httpd.conf comme suit:

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

Ajouter .py suffixe AddHandler, afin que nous puissions accéder au fichier de script python .py final:

AddHandler cgi-script .cgi .pl .py

Le premier programme de CGI

Nous utilisons Python pour créer le premier programme CGI appelé hello.py, le fichier se trouve dans / var / www / cgi-bin, comme suit:

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

Après avoir enregistré le hello.py de modification du fichier, modifier les autorisations de fichiers à 755:

chmod 755 hello.py 

Le programme ci-dessus est affiché dans le navigateur pour accéder aux résultats sont les suivants:

Le hello.py ce script est un script Python simple, le script de la première ligne de sortie "Content-type: text / html" pour envoyer le type de navigateur et de dire au navigateur d'afficher le contenu comme "text / html".

Sortie d'impression avec une ligne vide est utilisé pour indiquer la fin du serveur des informations d'en-tête.


en-tête HTTP

le contenu du fichier hello.py dans: une partie de l'en-tête HTTP est "Content-Type text / html", il sera envoyé au type de contenu du navigateur indique les fichiers du navigateur.

le format d'en-tête HTTP est la suivante:

HTTP 字段名: 字段内容

Par exemple:

Content-type: text/html

Le tableau suivant décrit les informations contenues dans les programmes CGI d'en-tête HTTP sont souvent utilisés:

tête description
Content-Type: MIME entité correspondant à la demande d'information. Par exemple: Content-type: text / html
Expire: Date date et l'heure de réponse expiré
Lieu: URL Pour rediriger le destinataire à une demande non-localisation URL pour compléter la demande ou de l'identification de nouvelles ressources
Dernière modification: Date La ressource demandée a été modifié
Content-length: N demande Content-Length
Set-Cookie: String Paramètres des cookies Http

Variables d'environnement CGI

Tous les programmes CGI ont reçu les variables d'environnement suivantes, qui ont joué un rôle important dans le programme CGI:

nom de la variable description
CONTENT_TYPE Cette valeur indique que la variable d'environnement du type de transfert d'informations MIME. À l'heure actuelle, les variables d'environnement sont généralement CONTENT_TYPE: application / x-www-form-urlencoded, il a dit que les données du formulaire HTML.
CONTENT_LENGTH Si les informations du serveur de mode de transfert et le programme CGI est POST, même si l'environnement entrée STDIN variable, le nombre d'octets qui peuvent être lues des données valides de la norme. Cette variable d'environnement lors de la lecture des données d'entrée doit être utilisé.
HTTP_COOKIE teneur en COOKIE dans le client.
HTTP_USER_AGENT Fournir de l'information comprend le numéro de version du navigateur du client ou d'autres données propriétaires.
PATH_INFO La valeur de cette variable d'environnement indique le nom du programme CGI immédiatement après les informations de chemin supplémentaire. Il apparaît souvent comme un argument de programme CGI.
QUERY_STRING Si les informations du serveur de mode de transfert et le programme CGI est l'information GET, la valeur de cette variable d'environnement, même si elle est adoptée. Cette information est suivie par le nom du programme CGI, tant dans le milieu avec un point d'interrogation "?" Separator.
REMOTE_ADDR La valeur de cette variable d'environnement est l'adresse IP du client envoie une requête, par exemple, le 192.168.1.67 ci-dessus. Cette valeur est toujours présente. Et il est la nécessité de fournir le client Web à l'identificateur unique du serveur Web peut être utilisé dans les programmes CGI pour distinguer entre les différents client Web.
REMOTE_HOST La valeur de cette variable d'environnement contient le nom d'hôte du client demandeur de CGI. Si cela ne vous veut pas de vérifier, vous ne devez définir cette variable d'environnement.
REQUEST_METHOD Il fournit une méthode appelée script. Pour HTTP script / protocole 1.0 que GET et POST significative.
SCRIPT_FILENAME Le chemin d'accès complet aux scripts CGI
SCRIPT_NAME Le nom du script CGI
SERVER_NAME Ceci est le nom d'hôte, alias, ou l'adresse IP de votre serveur WEB.
SERVER_SOFTWARE La valeur de cette variable d'environnement contient l'appel CGI nom et la version numéro de programme du serveur HTTP. Par exemple, la valeur au-dessus d'Apache / 2.2.14 (Unix)

Voici un simple variables d'environnement sortie CGI script CGI:

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

Enregistrer les points test.py ci-dessus, et de modifier les permissions de fichiers à 755, des résultats d'exécution sont les suivants:


Méthodes GET et POST

client du navigateur au serveur pour fournir des informations de deux façons, à la fois de la méthode est GET et les méthodes POST.

Utilisez la méthode GET de transfert de données

GET méthode pour envoyer les informations utilisateur codé sur le serveur, les informations de données est contenue dans l'URL de la demande de page à nombre divisé comme suit: "?":

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
GET demandes au sujet de certains des autres commentaires:
  • GET demande peut être mis en cache
  • demande GET reste dans l'historique du navigateur
  • Les requêtes GET peuvent être mis en signet
  • GET demandes ne devraient pas être utilisés lors du traitement de données sensibles
  • GET demandes ont des restrictions de longueur
  • GET demandes ne devraient être utilisées pour récupérer des données

Des exemples de simples url: méthode GET

Ce qui suit est un simple URL, en utilisant la méthode GET pour envoyer deux paramètres programme hello_get.py:

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

Un fichier code 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>"

Après avoir enregistré le hello_get.py de modification du fichier, modifier les autorisations de fichiers à 755:

chmod 755 hello_get.py 

Navigateur demande de sortie:

Des exemples de forme simple: méthode GET

Voici deux envoyer des données au serveur en utilisant la méthode GET via un formulaire HTML, soumis le même fichier hello_get.py de script serveur, le code hello_get.html est la suivante:

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

Par défaut, le répertoire cgi-bin ne peut stocker un fichier de script, nous serons dans le répertoire de test, modifiez le fichier des autorisations hello_get.html stockées sous forme de 755:

chmod 755 hello_get.html

présentation Gif est la suivante:

Utilisez la méthode POST pour transmettre des données

Utilisation de la méthode POST pour transmettre des données au serveur est plus sécurisé et fiable, que des informations sensibles telles que les mots de passe des utilisateurs ont besoin d'utiliser POST pour transférer des données.

Ce qui suit est également hello_get.py, il peut également gérer POST des données de formulaire soumises par le navigateur:

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

Voici un formulaire pour soumettre des données à la hello_get.py de script serveur par la méthode POST (méthode = "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>

présentation Gif est la suivante:

programme CGI pour transmettre des données par le biais de la case à cocher

case utilisée pour soumettre une ou plusieurs données d'option, le code HTML est comme suit:

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

Un fichier code 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>"

Modifier les autorisations checkbox.py:

chmod 755 checkbox.py

Navigateur Accès Gif présentation graphiques:

transfert de données radio via le programme CGI

Radio uniquement transférer des données à un serveur, le code HTML est comme suit:

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

code de script radiobutton.py est la suivante:

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

Modifier les autorisations radiobutton.py:

chmod 755 radiobutton.py

Navigateur Accès Gif présentation graphiques:

de transfert de données via Textarea programme CGI

pass Textarea multiples lignes de données sur le serveur, le code HTML est comme suit:

<!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 code de script est la suivante:

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

Modifier les autorisations textarea.py:

chmod 755 textarea.py

Navigateur Accès Gif présentation graphiques:

Déroulant des données passe par le programme CGI.

HTML code de la boîte de liste déroulante comme suit:

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

code de script dropdown.py comme suit:

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

Modifier les autorisations dropdown.py:

chmod 755 dropdown.py

Navigateur Accès Gif présentation graphiques:


CGI est utilisé Cookie

protocole Http dans un gros inconvénient est erroné de juger de l'identité d'un utilisateur, ce qui donne aux programmeurs beaucoup d'inconvénients, mais il semble fonctionnalité de cookie compensé cette lacune.

cookie qui accède au script lorsque le client via le navigateur du client sur le disque dur du client d'écrire des enregistrements de données, récupérer des données lorsqu'un client visite le script suivant, de manière à atteindre la fonction de déterminer l'identité, biscuit couramment utilisé dans la vérification de l'identité.

syntaxe cookie

Http cookie est envoyé par l'en-tête HTTP pour atteindre, il a dû transférer des fichiers, syntaxe tête Set-Cookie est le suivant:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name = nom: pour définir la valeur du cookie (nom ne peut pas être utilisé "," et "," nombre), quand il y a plusieurs valeurs de nom "," pour séparer, par exemple: nom1 = nom1; nom2 = nom2 ; nom3 = nom3.
  • expires = Date: biscuit date d'expiration dans le format: expires = "Wdy, DD- Lu-AAAA HH: MM: SS"
  • path = chemin: le chemin d' accès défini le support des cookies, si le chemin est un chemin, le cookie pour tous les fichiers et sous - répertoires de l'entrée de répertoire en vigueur, par exemple: path = "/ cgi-bin /", si le chemin est un fichier, biscuit Elle se réfère à l'entrée en vigueur de ce fichier, par exemple: path = "/ cgi-bin / cookie.cgi".
  • domain = domain: le nom de domaine du cookie est valide, par exemple: domain = "www.w3big.com"
  • sécuriser: Si ce drapeau est donné, que le cookie ne peut être transmis via le protocole SSL serveur https.
  • cookie est reçu par la définition des variables d'environnement HTTP_COOKIE atteint, les programmes CGI peuvent obtenir des informations en récupérant la variable de cookie.

Paramètres des cookies

Paramètres des cookies est très simple, biscuits seront envoyés séparément à l'en-tête http. L'exemple suivant définit le nom et expire dans un 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>
"""

Enregistrez le code ci-dessus pour cookie_set.py et modifier les autorisations cookie_set.py:

chmod 755 cookie_set.py

Les exemples ci-dessus utilisent l'en-tête Set-Cookie pour définir les informations Cookie, les options définies Cookie autres attributs, tels que l'expiration du temps Expire, domaine Domain, Path Path. Ces informations sont fournies: Avant "Content-type text / html".


Récupération d'informations Cookie

Cookie page recherche d'information est très simple, dans le CGI des variables d'environnement HTTP_COOKIE, le format de stockage est la suivante informations Cookie est stocké:

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

Voici un programme CGI simple pour récupérer les informations de 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>

"""

Enregistrez le code ci-dessus pour cookie_get.py et modifier les autorisations cookie_get.py:

chmod 755 cookie_get.py

Plus les paramètres de couleur Gif cookie sont les suivantes:

Exemples de téléchargement de fichiers

fichier de paramètres HTML pour télécharger besoin de définir l'attribut enctype multipart / form-data, code comme suit:

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

Code de fichier script save_file.py est la suivante:

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

Enregistrez le code ci-dessus pour save_file.py et modifier les autorisations save_file.py:

chmod 755 save_file.py

Plus les paramètres de couleur Gif cookie sont les suivantes:

Si vous utilisez Unix / Linux, vous devez remplacer le fichier séparateur à la fenêtre seulement besoin d'utiliser open déclaration () peut être:

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

boîte de dialogue de téléchargement de fichier

Nous créons fichier foo.txt dans le répertoire courant pour le téléchargement du programme.

Télécharger le fichier en définissant les informations d'en-tête HTTP pour mettre en œuvre le code de fonction est la suivante:

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