CGI脚本的位置是放置在服务器的cgi-bin目录中,以确保用户的CGI脚本可以读写。
安全起见:HTTP将用户的CGI脚本当作用户的nobody来执行,而且没有任何特别权限。脚本只能读取(写入或执行)任何人都可以读取(写入或执行)的脚本。
如果需要加载的模块路径不在Python的默认路径内,可以在加载前改变脚本内的路径变量。用户只能使用“import cgi”来加载cgi模块,不能使用“from cgi import *”

一、传输信息给Python脚本

使用URL传递信息给CGI脚本的时候,所传递的数据会转换为成对的name/value。name和value之间用等号(=)隔开,每一对name/value之间以&隔开,如果有空白就会被转换成加号(+)
特定字符会被转换成十六进制的格式(%HH),eg:”Joe Anderson”会被转换为”Joe%20Anderson”。
eg:

  1. ##使用POST方法,需要使用urllib模块来传输信息
  2. import urllib
  3. from flask import Flask
  4. request = urllib.parse.urlencode({"animal":"Monkey","age":"5"}).encode("utf-8")
  5. page = urllib.request.urlopen("http://127.0.0.1/cgi-bin/lhuan.py",request)
  6. response = page.read()

报错

  1. Traceback (most recent call last):
  2. File "e:/Apache24/cgi-bin/chuanshu.py", line 2, in <module>
  3. request = urllib.parse.urlencode({"animal":"Monkey","age":"5"}).encode("utf-8")
  4. AttributeError: module 'urllib' has no attribute 'parse'

解决:

  1. "方式1:"
  2. # import requests
  3. # import urllib
  4. "方式2:"
  5. from flask import Flask

URL内特定字符及其编码字符串

特定字符 编码字符串
/ %2F
~ %7E
: %3A
; %3B
@ %40
& %26
space %20
return %0A
tab %09

二、表单域的处理

每一个CGI脚本必须输出一个表头(Content-type标记)来描述文件的内容。
一般Content-type标记的值是text/html,text/plain,image/gif及image/jpeg。表头必须有一个空白行表示结尾。
客户端浏览器会读取CGI脚本返回的表头,但不会显示在网页上。

使用IIS当作网站服务器的时候,使用CGI脚本放置在网页的可执行目录\scripts中,在输入账号及密码后,单击“登录”按钮,CGI脚本会返回一个网页,显示所输入的账号及密码值,如果没有输入账号和密码,就会显示错误信息。

实例:

  1. #简单的html文件,里面有一个表单,在表单中有两个文本框,一个用于输入用户账号,另一个用于输入用户密码,当单击“登录”之后,使用POST方法执行服务器内的CGI脚本