使用CGI模块建立简单web页面教程实例
YPE html>
《使用CGI模块建立简单web页面教程实例》
在Python生态中,CGI(Common Gateway Interface)作为早期Web开发的核心技术,为动态网页生成提供了基础支持。尽管现代框架(如Django、Flask)已占据主流,但理解CGI的工作原理仍有助于掌握Web开发底层逻辑。本文将通过完整实例,演示如何使用Python内置的CGI模块创建交互式Web页面,涵盖环境配置、表单处理、动态内容生成等核心环节。
一、CGI基础与环境准备
CGI是一种标准协议,允许Web服务器通过调用外部程序(如Python脚本)生成动态内容。其工作流程为:用户请求→服务器启动CGI程序→程序输出HTML→服务器返回结果。
1.1 服务器配置要求
需确保Web服务器支持CGI执行:
- Apache:修改
httpd.conf
,设置ScriptAlias /cgi-bin/ "/path/to/cgi-bin/"
,并添加AddHandler cgi-script .py
- Nginx:需配合FastCGI或反向代理至CGI处理程序
- 本地测试:可使用Python内置的
http.server
模块(Python 3.7+需添加--cgi
参数)
1.2 脚本权限设置
CGI脚本需具备可执行权限:
chmod +x /path/to/script.py
首行需指定Python解释器路径(Unix/Linux):
#!/usr/bin/env python3
二、创建第一个CGI脚本
2.1 基础HTML输出
以下脚本演示如何生成简单HTML页面:
#!/usr/bin/env python3
print("Content-type: text/html\n") # CGI头必须包含Content-type
print("""
CGI示例
欢迎使用Python CGI
当前时间:{}
""".format(__import__('datetime').datetime.now()))
关键点:
- 首行输出必须是HTTP头(以双换行符结束)
- 使用三引号保留HTML格式
- 动态内容通过字符串格式化插入
2.2 处理表单数据
CGI模块提供了FieldStorage
类解析表单数据。创建包含表单的HTML:
#!/usr/bin/env python3
import cgi
print("Content-type: text/html\n")
form = cgi.FieldStorage()
if "name" in form:
name = form.getvalue("name")
else:
name = "访客"
print(f"""
你好,{name}!
""")
三、进阶功能实现
3.1 文件上传处理
通过CGI接收上传文件需注意:
- 表单需设置
enctype="multipart/form-data"
- 使用
file
属性获取文件对象
#!/usr/bin/env python3
import cgi, os
print("Content-type: text/html\n")
form = cgi.FieldStorage()
if "upload" in form and form["upload"].filename:
file_item = form["upload"]
upload_path = os.path.join("/tmp", file_item.filename)
with open(upload_path, 'wb') as f:
f.write(file_item.file.read())
print("文件上传成功!")
else:
print("""
""")
3.2 Cookie管理
CGI可通过HTTP头操作Cookie:
#!/usr/bin/env python3
import cgi, http.cookies
print("Content-type: text/html\n")
# 读取Cookie
cookie = http.cookies.SimpleCookie()
try:
cookie.load(os.environ.get('HTTP_COOKIE', ''))
except:
pass
# 设置新Cookie
if "visit_count" not in cookie:
cookie["visit_count"] = "1"
cookie["visit_count"]["path"] = "/"
else:
count = int(cookie["visit_count"].value) + 1
cookie["visit_count"] = str(count)
# 输出Cookie头
print(cookie.output())
print(f"""
访问次数:{cookie["visit_count"].value}
""")
四、调试与安全实践
4.1 常见错误排查
- 500内部错误:检查脚本权限、首行解释器路径、HTTP头格式
-
空输出:确保HTTP头后有两个换行符(
\n\n
) -
表单数据为空:验证表单
method
与脚本处理方式是否匹配
4.2 安全注意事项
- 输入验证:对所有用户输入进行转义,防止XSS攻击
import html
safe_input = html.escape(form.getvalue("user_input"))
os.path.abspath
五、完整项目示例:用户登录系统
5.1 数据库模拟(使用字典)
users_db = {
"admin": "admin123",
"user1": "password1"
}
5.2 登录页面(login.py)
#!/usr/bin/env python3
import cgi, html
print("Content-type: text/html\n")
form = cgi.FieldStorage()
error = None
if "username" in form and "password" in form:
username = form.getvalue("username")
password = form.getvalue("password")
if users_db.get(username) == password:
print("Location: welcome.py\n\n") # 重定向
exit()
else:
error = "用户名或密码错误"
print(f"""
用户登录
{'' + html.escape(error) + '
' if error else ''}
""")
5.3 欢迎页面(welcome.py)
#!/usr/bin/env python3
import cgi, os, html
print("Content-type: text/html\n")
# 简单的会话模拟
cookie = http.cookies.SimpleCookie()
if "HTTP_COOKIE" in os.environ:
cookie.load(os.environ["HTTP_COOKIE"])
if "session" not in cookie:
print("Location: login.py\n\n")
exit()
else:
print("Location: login.py\n\n")
exit()
print(f"""
欢迎回来!
这是您的受保护页面。
""")
六、CGI与现代框架对比
虽然CGI实现简单,但存在性能瓶颈:
- 进程开销:每个请求启动新进程
- 功能局限:缺乏路由、模板引擎等高级功能
- 推荐场景:遗留系统维护、极简需求、学习Web原理
现代替代方案:
- WSGI:如Gunicorn + Flask/Django
- ASGI:支持异步的Starlette、FastAPI
- 微框架:Bottle(单文件设计类似CGI)
关键词:Python CGI模块、Web开发教程、表单处理、文件上传、Cookie管理、安全实践、CGI与WSGI对比
简介:本文通过完整实例演示如何使用Python内置的CGI模块创建动态Web页面,涵盖基础HTML输出、表单数据处理、文件上传、Cookie管理等核心功能,同时提供调试技巧和安全防护方案,最后对比CGI与现代框架的差异,适合Web开发初学者理解底层原理。