位置: 文档库 > Python > 使用CGI模块建立简单web页面教程实例

使用CGI模块建立简单web页面教程实例

袁和平 上传于 2022-06-28 02:05

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开发初学者理解底层原理。