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
目录下:
-- -------------------- ---- ------- -------------- ------- -------------------- ---------- --------------- --------- - -- --------------- ------------------------- ---------------------- --------------- ---------------- ------------- ---------------- ----------------
确保该文件具有可执行权限(例如,在 Linux 上使用 chmod +x hello.py
)。
输出类型
根据需要,你可以改变 Content-Type
头信息以适应不同的输出格式,比如 application/json
或 text/plain
。
处理表单数据
CGI 脚本经常需要处理来自 HTML 表单的数据。Python 提供了内置模块 cgi
来简化这个过程。
示例:处理表单数据
创建一个名为 form.py
的文件:
-- -------------------- ---- ------- -------------- ------- ------ --- -------------------- ---------- --------------- --------- ---- - ------------------ ---- - --------------------- -------- --------------- ------------------------ --------------------- --------------- ----------------- -------------- ---------------- ----------------
在 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 服务器上部署它们。