Python CGI编程
- Python CGI 编程用于创建动态网页,适合初学者学习服务器端脚本。
- 需要配置支持 CGI 的 Web 服务器(如 Apache),并将脚本放在 cgi-bin 目录。
- 编写 CGI 脚本需打印 HTTP 头部(如
Content-type: text/html\r\n\r\n
),然后输出 HTML。 - Python 3.13 后,
cgi
模块已移除,可用 PyPI 的legacy-cgi
替代。 - 可使用 Python 内置服务器测试,命令为
python3 -m http.server --cgi 8000
。
基本步骤
配置环境:确保 Web 服务器(如 Apache)支持 CGI,设置 cgi-bin 目录(如 /var/www/cgi-bin/
),并赋予脚本执行权限(如 chmod 755 filename
)。
编写简单脚本:以下是一个示例:
#!/usr/bin/python3
print("Content-type: text/html\r\n\r\n")
print("<html><body><h1>你好,世界!</h1></body></html>")
保存到 cgi-bin 目录,访问如 http://localhost/cgi-bin/hello.py。
处理表单数据:使用 cgi.FieldStorage()
解析表单输入,例如:
import cgi
form = cgi.FieldStorage()
print("Content-type: text/html\r\n\r\n")
print("<html><body>")
if form.getvalue("name"):
print("你好," + form.getvalue("name") + "!")
print("</body></html>")
测试环境:开发时可用 Python 内置服务器,命令 python3 -m http.server --cgi 8000
,将脚本放至 cgi-bin 目录,访问如 http://localhost:8000/cgi-bin/script.py。
注意:Python 3.13 后 cgi
模块移除,需安装 legacy-cgi
包。深入学习。
详细报告
本文旨在全面介绍 Python CGI 编程,涵盖其基本概念、配置方法、脚本编写及测试环境,适合初学者和有一定基础的用户参考。以下内容基于权威资源和示例分析,确保信息准确且实用,时间截至 2025 年 4 月 12 日。
背景与模块介绍
CGI(Common Gateway Interface,通用网关接口)是一种标准,定义了 Web 服务器如何与外部程序(如 Python 脚本)交换信息,生成动态网页内容。Python 通过 cgi
模块支持 CGI 编程,适合处理用户表单输入、数据库查询等交互式任务。
然而,截至 2025 年 4 月 12 日,Python 3.13.3 已发布,cgi
模块在 Python 3.13 中被移除(此前在 Python 3.11 已被弃用),用户需使用 PyPI 的 legacy-cgi
包替代。对于使用 Python 3.12 或更早版本的用户,cgi
模块仍可用。
核心功能与使用方法
Python CGI 编程的核心在于编写可由 Web 服务器执行的脚本,这些脚本通常输出 HTML 内容,并可处理用户输入。以下是常见步骤和示例:
Web 服务器配置
要运行 CGI 脚本,需要配置支持 CGI 的 Web 服务器。Apache 是常见选择,配置步骤包括:
- 设置 CGI 目录:默认路径为
/var/www/cgi-bin/
,可通过ScriptAlias /cgi-bin/ /var/www/cgi-bin/
配置。 - 添加文件扩展名处理:编辑
httpd.conf
,添加AddHandler cgi-script .cgi .pl .py
,使.cgi
和.py
文件被识别为 CGI 脚本。 - 赋予执行权限:使用
chmod 755 filename
确保脚本可执行。
对于 Windows 系统,需安装 Apache(如 WAMP),并以管理员身份启动 CMD。
编写第一个 CGI 程序
以下是一个简单示例,文件名为 hello.py
,放置于 /var/www/cgi-bin/
:
#!/usr/bin/python3
print("Content-type: text/html\r\n\r\n")
print("<html>")
print("<head>")
print("<title>你好世界</title>")
print("</head>")
print("<body>")
print("<h2>你好世界 - 我的第一个 CGI 程序!</h2>")
print("<p>你好世界!我是来自菜鸟教程的第一CGI程序</p>")
print("</body>")
print("</html>")
访问 URL 如 http://localhost/cgi-bin/hello.py。脚本需打印 HTTP 头部(如 Content-type: text/html\r\n\r\n
),后跟 HTML 内容。
处理表单数据
CGI 脚本常用于处理 HTML 表单输入。以下示例处理用户提交的姓名:
import cgi
form = cgi.FieldStorage()
print("Content-type: text/html\r\n\r\n")
print("<html><body>")
print("<h2>GeeksforGeeks</h2>")
if form.getvalue("name"):
name = form.getvalue("name")
print("你好," + name + "!")
print("</body></html>")
表单 HTML 如 hello_form.html
,使用 POST 方法提交至 hello_process.py
,需确保文件权限为 chmod 755
。
HTTP 头部与环境变量
CGI 脚本需正确设置 HTTP 头部,格式为 HTTP 字段名: 字段内容
,常见头部包括:
Head | Description |
---|---|
Content-type | MIME 类型,如 text/html |
Expires | 响应过期日期 |
Location | 重定向 URL |
Last-modified | 资源最后修改日期 |
Content-length | 请求内容长度 |
Set-Cookie | 设置 HTTP Cookie |
环境变量提供请求信息,关键变量包括:
Variable | Description |
---|---|
CONTENT_TYPE | MIME 类型,通常为 application/x-www-form-urlencoded |
CONTENT_LENGTH | POST 数据字节数 |
HTTP_COOKIE | 客户端 Cookie 内容 |
HTTP_USER_AGENT | 浏览器信息 |
PATH_INFO | CGI 程序路径信息 |
QUERY_STRING | GET 请求数据,URL 中 ? 后的部分 |
REMOTE_ADDR | 客户端 IP 地址 |
REMOTE_HOST | 客户端主机名(若支持) |
REQUEST_METHOD | 请求方法,如 GET、POST |
SCRIPT_FILENAME | CGI 脚本完整路径 |
SCRIPT_NAME | CGI 脚本名称 |
SERVER_NAME | 服务器主机名、别名或 IP |
SERVER_SOFTWARE | 服务器名称和版本,如 Apache/2.2.14 |
示例脚本如 test.py
,可使用 os.environ.keys()
输出所有环境变量。
GET 和 POST 方法
- GET 方法:数据通过 URL 传递,如
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
。 - POST 方法:更安全,适合敏感数据,如密码输入。示例脚本
hello_get.py
可处理两者,使用cgi.FieldStorage()
解析。
Cookie 使用
设置 Cookie 通过 HTTP 头部 Set-Cookie: name=value;expires=date;path=path;domain=domain;secure
,获取通过 HTTP_COOKIE
环境变量。示例脚本如 cookie_set.py
和 cookie_get.py
,需设置权限 chmod 755
。
文件上传与下载
- 文件上传:表单需设置
enctype="multipart/form-data"
,如 HTML 表单 action 为/cgi-bin/save_file.py
。脚本save_file.py
保存至/tmp/
,权限chmod 755
。 - 文件下载:使用 HTTP 头部
Content-Disposition: attachment; filename="foo.txt"
,脚本读取foo.txt
二进制内容。
测试与开发环境
为简化开发,可使用 Python 内置 HTTP 服务器测试 CGI 脚本。命令为:
python3 -m http.server --cgi 8000
将 CGI 脚本置于 cgi-bin
目录,访问如 http://localhost:8000/cgi-bin/script.py。确保目录路径无空格,避免服务器错误。
具体步骤包括:
- Windows:双击
startServer.cmd
或右键localCGIServer.py
选择 Open With -> Python Launcher。 - Mac:使用
cgiServerScript
或类似操作。 - 访问 URL 如 http://localhost:8080/adder.cgi,测试表单如 http://localhost:8080/adder.html。
错误处理包括语法错误(Idle 检查模块)、执行错误(浏览器显示)、服务器错误(控制台日志),可使用 dumpcgi.cgi
调试表单。
高级应用与注意事项
对于生产环境,建议使用现代 Web 框架如 Flask 或 Django,而非 CGI,因 CGI 性能较低,适合学习用途。文档提到正则表达式和表单处理可结合使用。
注意反斜杠处理,建议使用原始字符串(如 r"text"
)避免转义冲突。Python 3.13 后需安装 legacy-cgi
,命令为 pip install legacy-cgi
。