CGI (Common Gateway Interface) 是一种标准,用于服务器与外部应用程序之间的通信。通过 CGI,Web 服务器可以调用外部程序来处理动态内容生成,这些外部程序可以是用 Python 编写的脚本。
CGI 简介
CGI 是一种简单且广泛支持的协议,它允许 Web 服务器执行外部程序,并将程序的输出返回给客户端浏览器。尽管现代 Web 开发更倾向于使用更先进的技术如框架(Django, Flask 等),但理解 CGI 仍然有其价值,尤其是在处理一些遗留系统时。
设置环境
在开始之前,你需要确保你的服务器支持 CGI。大多数现代 Web 服务器如 Apache 和 Nginx 都支持 CGI。此外,你需要安装 Python 并确保它可以在命令行中运行。
安装 Python
如果你还没有安装 Python,可以从官方网站下载并安装最新版本。对于 Windows 用户,安装过程中请勾选“Add Python to PATH”选项。
配置 Web 服务器
Apache
- 打开 Apache 的配置文件(通常是
httpd.conf或者apache2.conf)。 - 添加以下内容以启用 CGI 模块:
LoadModule cgi_module modules/mod_cgi.so
- 在你的网站目录下创建一个名为
cgi-bin的文件夹,并设置适当的权限(例如,755)。 - 在站点配置文件中添加以下内容以指定 CGI 脚本的位置:
<Directory "/path/to/your/site/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Require all granted </Directory>
Nginx
- 安装
fcgiwrap,这是一个轻量级的 FastCGI 代理,可以处理 CGI 脚本。 - 修改 Nginx 配置文件,例如
/etc/nginx/sites-available/default:location ~ \.py$ { include fastcgi_params; fastcgi_pass unix:/var/run/fcgiwrap.socket; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
编写 CGI 脚本
CGI 脚本需要满足特定的输出格式:首先发送 HTTP 头信息,然后是一个空行,最后是页面内容。
示例:Hello World
创建一个名为 hello.py 的文件,并将其放在 cgi-bin 目录下:
// www.javascriptcn.com code example
#!/usr/bin/env python3
print("Content-Type: text/html; charset=utf-8")
print("") # 空行
print("<html>")
print("<head><title>Hello World</title></head>")
print("<body>")
print("<h1>Hello World!</h1>")
print("</body>")
print("</html>")确保该文件具有可执行权限(例如,在 Linux 上使用 chmod +x hello.py)。
输出类型
根据需要,你可以改变 Content-Type 头信息以适应不同的输出格式,比如 application/json 或 text/plain。
处理表单数据
CGI 脚本经常需要处理来自 HTML 表单的数据。Python 提供了内置模块 cgi 来简化这个过程。
示例:处理表单数据
创建一个名为 form.py 的文件:
// www.javascriptcn.com code example
#!/usr/bin/env python3
import cgi
print("Content-Type: text/html; charset=utf-8")
print("")
form = cgi.FieldStorage()
name = form.getvalue('name', 'Guest')
print("<html>")
print("<head><title>Form Data</title></head>")
print("<body>")
print(f"<h1>Hello {name}!</h1>")
print("</body>")
print("</html>")在 HTML 中创建一个简单的表单指向这个脚本:
<form action="/cgi-bin/form.py" method="post">
Name: <input type="text" name="name">
<input type="submit" value="Submit">
</form>安全性考虑
输入验证
始终验证从用户接收的所有输入,防止注入攻击和其他安全问题。
文件权限
确保你的 CGI 脚本和相关文件只有必要的权限,避免因权限过高而导致的安全风险。
使用日志记录
使用日志记录来监控和调试你的 CGI 脚本。这有助于诊断潜在的问题。
结束语
尽管 CGI 已经不如从前流行,但它仍然是一个有用的工具,特别是在处理某些遗留系统或小型项目时。通过上述示例,你应该能够开始编写基本的 CGI 脚本,并理解如何在 Web 服务器上部署它们。