Python CGI编程完全指南
面向小白的超详细知识点汇总 – 从零开始学习服务器端网页开发
什么是CGI?
CGI(通用网关接口)是Web服务器与外部程序(比如Python脚本)进行通信的标准协议。
简单说就是:
- 当你在浏览器访问一个网页时,Web服务器(如Apache/Nginx)会处理请求
- 如果这个请求需要动态内容(如表单提交、实时数据),服务器会启动CGI程序
- CGI程序(Python脚本)生成动态内容,返回给服务器
- 服务器再把结果返回给你的浏览器
小白理解法:把CGI想象成餐厅的服务员(Web服务器)和厨师(Python脚本)之间的协作。你点菜(请求网页),服务员把订单交给厨师,厨师做好菜(生成网页),服务员再端给你。
CGI开发环境搭建
要运行Python CGI程序,你需要:
1. Web服务器
- Apache(最常用)
- Nginx(需要额外配置)
- Python内置模块(
http.server
,适合测试)
2. 配置服务器
以Apache为例,需要做这些设置:
# 启用CGI模块(通常默认已启用)
LoadModule cgi_module modules/mod_cgi.so
# 指定CGI脚本目录
<Directory “/var/www/cgi-bin”>
Options +ExecCGI
AddHandler cgi-script .cgi .py
</Directory>
LoadModule cgi_module modules/mod_cgi.so
# 指定CGI脚本目录
<Directory “/var/www/cgi-bin”>
Options +ExecCGI
AddHandler cgi-script .cgi .py
</Directory>
3. Python脚本要求
- 脚本需要有执行权限:
chmod +x script.py
- 第一行必须是Python解释器路径(称为shebang):
#!/usr/bin/env python3
- 输出必须包含HTTP头部(尤其是Content-Type)
第一个CGI程序:Hello World
创建一个最简单的CGI程序,在浏览器中显示”Hello World!”
#!/usr/bin/env python3
print(“Content-Type: text/html”) # 必须的HTTP头部
print() # 空行分隔头部和内容
print(“””<html>
<head><title>My First CGI</title></head>
<body>
<h2>Hello World!</h2>
</body>
</html>”””)
print(“Content-Type: text/html”) # 必须的HTTP头部
print() # 空行分隔头部和内容
print(“””<html>
<head><title>My First CGI</title></head>
<body>
<h2>Hello World!</h2>
</body>
</html>”””)
关键点:
- Content-Type:告诉浏览器返回内容的类型(HTML/纯文本/图片等)
- 空行:HTTP头部和内容之间必须有一个空行
- 输出HTML:CGI程序输出HTML代码,浏览器会渲染它
处理用户输入
CGI最常见的用途是处理用户通过表单提交的数据。
两种提交方法:
GET方法
- 数据附加在URL后面(如
?name=John&age=30
) - 有长度限制(约2048字符)
- 适合获取数据,书签分享
- 数据在浏览器地址栏可见
POST方法
- 数据在HTTP请求体中发送
- 无长度限制
- 适合提交表单、上传文件
- 数据不在地址栏显示
获取GET/POST数据
#!/usr/bin/env python3
import cgi
# 获取表单数据
form = cgi.FieldStorage()
# 获取单个值
name = form.getvalue(‘name’)
age = form.getvalue(‘age’)
# 获取多个值(如复选框)
hobbies = form.getlist(‘hobby’)
# 输出结果…
import cgi
# 获取表单数据
form = cgi.FieldStorage()
# 获取单个值
name = form.getvalue(‘name’)
age = form.getvalue(‘age’)
# 获取多个值(如复选框)
hobbies = form.getlist(‘hobby’)
# 输出结果…
Python的cgi模块
Python标准库中的cgi
模块提供了处理CGI编程的实用工具。
常用功能:
# 创建FieldStorage实例解析表单数据
import cgi
form = cgi.FieldStorage()
# 转义HTML特殊字符,防止XSS攻击
safe_output = cgi.escape(“<script>alert(‘hack’)</script>”)
# 调试模式 – 显示详细错误信息
cgi.test() # 访问时在URL后加”?test=1″
# 处理文件上传
file_item = form[‘uploaded_file’]
if file_item.file:
data = file_item.file.read()
# 保存文件到服务器
import cgi
form = cgi.FieldStorage()
# 转义HTML特殊字符,防止XSS攻击
safe_output = cgi.escape(“<script>alert(‘hack’)</script>”)
# 调试模式 – 显示详细错误信息
cgi.test() # 访问时在URL后加”?test=1″
# 处理文件上传
file_item = form[‘uploaded_file’]
if file_item.file:
data = file_item.file.read()
# 保存文件到服务器
安全提示:
- 永远不要信任用户输入!验证和清理所有数据
- 使用
cgi.escape()
防止跨站脚本攻击(XSS) - 限制文件上传大小和类型
CGI工作流程
1
用户通过浏览器访问CGI脚本URL
2
Web服务器接收请求
3
服务器启动Python解释器执行CGI脚本
4
CGI脚本处理请求(读取输入、访问数据库等)
5
CGI脚本输出HTTP响应(头部+内容)
6
服务器将响应返回给浏览器
7
浏览器渲染HTML页面
CGI的优缺点
优点
- 简单易懂,学习曲线平缓
- 语言无关(可用Python、Perl等)
- 进程隔离(脚本崩溃不会影响服务器)
- 标准协议,所有主流服务器都支持
缺点
- 性能较低(每次请求都启动新进程)
- 资源消耗大(高并发时问题更明显)
- 功能有限(不如现代Web框架强大)
- 安全性需要额外注意
现代替代方案
虽然CGI是基础,但现在有更高效的Python Web方案:
- WSGI:Python标准Web接口
- Flask:轻量级Web框架
- Django:全功能Web框架
- FastAPI:高性能现代框架
学习建议:从CGI入门了解Web原理,然后转向WSGI和现代框架
CGI调试技巧
- 检查脚本权限:
chmod +x your_script.py
- 查看服务器错误日志(Apache:
/var/log/apache2/error.log
) - 在脚本开头加入:
import cgitb; cgitb.enable()
- 用命令行测试:
python your_script.py
- 输出简单文本内容,排除HTML错误