什么是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>

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>”””)

关键点:

  • 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’)

# 输出结果…

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()
    # 保存文件到服务器

安全提示:

  • 永远不要信任用户输入!验证和清理所有数据
  • 使用cgi.escape()防止跨站脚本攻击(XSS)
  • 限制文件上传大小和类型