一、介绍

官方文档:https://docs.python.org/3/library/cgi.html
通用网关接口(CGI)脚本的支持模块,该模块定义了许多实用程序,可供Python编写的CGI脚本使用。
HTTP服务器调用CGI脚本,通常用于处理通过HTML

元素提交的用户输入。
CGI脚本通常位于cgi-bin目录中。
HTTP服务器将有关请求的各种信息(eg:客户端的主机名、请求的URL、查询字符串等内容)放置在脚本的外壳环境中,执行脚本,并将脚本的输出发送给客户。

1.1 输入

脚本的输入也连接到客户端,有时通过这种方式读取表单数据。
CGI模块将服务器设置的sys.stdin与环境变量当作输入的来源,环境变量如下表所示。

环境变量 说明
AUTH_TYPE 认证方式
CONTENT_LENGTH 在sys.stdin中输入的数据长度
CONTENT_TYPE 查看数据的类型
DOCUMENT_ROOT 文件的根目录
GATEWAY_INTERFACE CGI的版本字符串
HTTP_ACCEPT 可为客户端接收的MIME类型
HTTP_COOKIE Netscape专用的Cookie值
HTTP_FROM 客户端的电子邮件地址
HTTP_REFERER 引用的URL网址
HTTP_USER_AGENT 客户端的浏览器
PATH_INFO 所传递的路径信息
PATH_TRANSLATED 转译过来的PATH_INFO
QUERY_STRING 查询字符串
REMOTE_ADDR 客户端的远程IP地址
REMOTE_HOST 客户端的远程主机地址
REMOTE_IDENT 提出请求的客户
REMOTE_USER 授权的用户名称
REQUEST_METHOD 所调用的方法,可以是GET或POST
SCRIPT_NAME 脚本程序的名称
SERVER_NAME 服务器端主机名称
SERVER_PORT 服务器端的通信端口号码
SERVER_PROTOCOL 服务器端的通信协议
SERVER_SOFTWARE 服务器端软件的名称与版本

1.2 输出

CGI脚本的输出由两个部分组成,并用空白行分割。
第一部分包含许多表头,高速客户端要遵循的数据类型
第二部分通常是HTML,允许客户端润建显示带有标题、嵌入式图像等格式良好的文本。

1.3 例子

1

写入cs.py到cgi-bin目录中

  1. #!C:\Users\lh\AppData\Local\Programs\Python\Python37\python.exe
  2. #coding=utf-8
  3. print("Content-Type: text/html") # HTML is following
  4. print()
  5. print("<TITLE>CGI script output</TITLE>")
  6. print("<H1>This is my first CGI script</H1>")
  7. print("Hello, world!")

打开Apache服务,然后访问http://127.0.0.1:8088/cgi-bin/cs.py
image.png

2.

CGI脚本输出CGI的环境变量

  1. #!C:\Users\lh\AppData\Local\Programs\Python\Python37\python.exe
  2. #coding=utf-8
  3. import os
  4. print("Content-type:text/html")
  5. print()
  6. print("<meta charset=\"utf-8\" />")
  7. print("<b>环境变量</b><br>")
  8. print("<ul>")
  9. for key in os.environ.keys():
  10. print("<li><span style = 'color:green'>%30s </span>:%s </li>"%(key, os.environ[key]))
  11. print("</ul>")

打开Apache服务,然后访问http://127.0.0.1:8088/cgi-bin/cs.py
image.png

1.4 使用

cgi模块的FieldStorage类可以读物标准输入(POST方法)或查询字符串(GET方法)。
要解析HTML表格的内容,需要创建一个FieldStorage类的实例变量,因为消耗标准输入,它只能实例化一次。
表单中包含非ASCII字符,需要使用encoding关键字参数为文档定义编码值。通常包含在在HTML文档的HEAD部分的META标记中或 Content-Type标头中。
每一个表格字段都被定义成一个MiniFieldStorage类的实例变量。每一个实例变量都是以字典集的类型来存取。
字典集的键值(key)是表格的字段名称,字典集的值(value)是表格的字段内容,如果表格字段有多个值,eg:下拉列表框,就会产生MiniFieldStorage实例变量的列表。

1.5功能

cgi模块的函数

函数 说明
cgi.parse(fp=None, environ=os.environ, keep_blank_values=False, strict_parsing=False) 从环境变量或file文件中解析查询
cgi.parse_multipart(fp, pdict, encoding=”utf-8”, errors=”replace”) 解析multipart / form-data类型的输入(用于文件上传)
参数是输入文件的fp
字典是在Content-Type标头中包含其他参数的字典的pdict,以及编码(请求编码)的参数
cgi.parse_header(string) 将MIME标头(例如Content-Type)解析为一个主值和一个参数字典。
cgi.test() 测试CGI脚本
cgi.print_environ() 格式化HTML shell 的环境变量
cgi.print_form(form) 格式化HTML的表单
cgi.print_directory() 格式化HTML目前的文件夹
cgi.print_environ_usage() 测试CGI脚本