【Python CGI编程】

Python CGI(通用网关接口)编程是早期Web开发中实现动态网页的技术方案。以下是系统化指南,包含核心概念、实现步骤及安全实践:


一、CGI 基础概念

1. 工作原理
浏览器请求 → Web服务器(如Apache) → 执行CGI脚本 → 生成HTML → 返回响应
2. 环境要求
  • Web服务器支持CGI(需配置ScriptAlias
  • Python解释器安装
  • 脚本文件权限设置为可执行(chmod +x script.py

二、Python CGI 开发步骤

1. 基础脚本结构
#!/usr/bin/env python3
# -*- coding: utf-8 -*-import cgi
import cgitb
cgitb.enable()  # 启用详细错误报告(生产环境应关闭)print("Content-Type: text/html; charset=utf-8")  # 必须的首行输出
print()  # 空行分隔HTTP头和正文print("<h1>Hello CGI World!</h1>")
2. 处理表单数据
form = cgi.FieldStorage()
username = form.getvalue('username', '匿名用户')  # 获取字段值print(f"""
<html>
<body><h2>欢迎, {cgi.escape(username)}!</h2><form method="post"><input type="text" name="message"><input type="submit"></form>
</body>
</html>
""")
3. 生成动态内容
import timeprint("<p>当前服务器时间: %s</p>" % time.ctime())

三、Apache 服务器配置示例

# httpd.conf 配置片段
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">AllowOverride NoneOptions +ExecCGI -MultiViews +SymLinksIfOwnerMatchRequire all grantedAddHandler cgi-script .py
</Directory>

四、安全最佳实践

1. 输入验证
# 严格验证数字输入
try:age = int(form.getvalue('age', 0))if age < 0 or age > 120:raise ValueError
except ValueError:print("年龄必须为0-120之间的整数")
2. 输出转义
from html import escapeuser_input = "<script>alert('xss')</script>"
print("<p>安全输出: %s</p>" % escape(user_input))
3. 文件操作安全
import osupload_dir = "/var/www/uploads"
filename = os.path.basename(form['file'].filename)  # 防止路径遍历
if not filename.isalnum():raise ValueError("非法文件名")filepath = os.path.join(upload_dir, filename)
with open(filepath, 'wb') as f:f.write(form['file'].file.read())

五、性能优化技巧

1. 缓存机制
import time
import osCACHE_TTL = 300  # 5分钟缓存
cache_file = "/tmp/cached_data"if os.path.exists(cache_file) and (time.time() - os.path.getmtime(cache_file)) < CACHE_TTL:with open(cache_file) as f:print(f.read())
else:# 生成新内容data = generate_expensive_data()with open(cache_file, 'w') as f:f.write(data)print(data)
2. 连接复用
import mysql.connector# 使用持久连接池
class DBPool:_pool = None@classmethoddef get_connection(cls):if not cls._pool:cls._pool = mysql.connector.pooling.MySQLConnectionPool(pool_name="mypool",pool_size=5,host='localhost',database='testdb')return cls._pool.get_connection()

六、现代替代方案建议

虽然CGI仍可用于特定场景,但更推荐现代方案:

  1. WSGI框架

    # Flask 示例(替代CGI)
    from flask import Flask, request
    app = Flask(__name__)@app.route('/')
    def hello():return '<h1>Hello Flask!</h1>'if __name__ == '__main__':app.run()
    
  2. 异步框架

    • FastAPI(高性能异步框架)
    • Tornado(长轮询/WebSocket支持)

七、调试技巧

  1. 命令行测试

    echo -e "username=test&password=123" | python3 script.py
    
  2. 日志记录

    import sys
    sys.stderr.write("DEBUG: 收到POST请求\n")
    
  3. 性能分析

    import cProfile
    cProfile.run('process_request()', 'profile.stats')
    

通过遵循这些实践,可以在传统CGI环境中构建安全可靠的Web应用。对于新项目,建议优先采用现代Web框架以获得更好的性能和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库故障排查指南:从入门到精通

1. 常见数据库故障类型 1.1 连接故障 数据库连接超时连接池耗尽网络连接中断认证失败1.2 性能故障 查询执行缓慢内存使用过高CPU使用率异常磁盘I/O瓶颈1.3 数据故障 数据不一致数据丢失数据损坏事务失败2. 故障排查流程 2.1 初步诊断 -- 检查数据库状态SHOW STATUS;SHOW PRO…

conda创建环境常用命令(个人用)

创建环境 conda create --name your_project_name创建环境 ---- 指定环境python版本 conda create --name your_project_name python3.x环境列表 conda env list激活环境 conda activate your_project_name退出环境 conda deactivate环境列表 #使用conda命令 conda list …

PCL 绘制二次曲面

文章目录 一、简介二、实现代码三、实现效果一、简介 这里基于二次曲面的公式: z = a 0 + a 1 x + a 2 y + a

一文讲透面向对象编程OOP特点及应用场景

面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;是一种以对象为核心、通过类组织代码的编程范式。它通过模拟现实世界的实体和交互来构建软件系统&#xff0c;是现代软件开发中最广泛使用的范式之一。以下是 OOP 的全面解析&#xff1a; 一、OOP 的四大…

linux,我启动一个springboot项目, 用java -jar xxx.jar ,但是没多久这个java进程就会自动关掉

当使用 java -jar xxx.jar & 启动 Spring Boot 项目后进程自动关闭时&#xff0c;可能由多种原因导致。以下是常见排查步骤和解决方案&#xff1a; 一、查看日志定位原因 进程异常关闭通常会在控制台或日志中留下线索&#xff0c;建议先获取完整日志&#xff1a; 1. 查看…

【独家精简】win11(24h2)清爽加速版

自作该版本的初心&#xff1a;随着电脑性能的不断提升&#xff0c;我们需要的更多的是没有广告&#xff0c;没有推荐&#xff0c;没有收集隐私的windows清爽版纯净系统 目前只会去制作windows系统专业版 1、去除Windows系统自带的广告新闻和推荐以及小组间和聊天功能。 2、精简…

大二java第一面小厂(挂)

第一场&#xff1a; mybatis怎么防止数据转义。 Hutool用的那些你常用的方法。 springboot的常用注解。 redis的多级缓存。 websocket怎么实现的多人协作编辑功能。 怎么实现的分库分表。 mysql里面的各种操作&#xff0c;比如说分表怎么分&#xff0c;分页查询怎么用。 mybat…

OceanBase 的系统变量、配置项和用户变量有何差异

在继续阅读本文之前&#xff0c;大家不妨先思考一下&#xff0c;数据库中“系统变量”、“用户变量”以及“配置项”这三者之间有何不同。如果感到有些模糊&#xff0c;那么本文将是您理清这些概念的好帮手。 很多用户在使用OceanBase数据库中的“配置项”和“系统变量”&#…

HTML-3.3 表格布局(学校官网简易布局实例)

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 系列文章目录 HTML-1.1 文本字体样式-字体设置、分割线、段落标签、段内回车以及特殊符号 HTML…

如何在Edge浏览器里-安装梦精灵AI提示词管理工具

方案一&#xff08;应用中心安装-推荐&#xff09;&#xff1a; 梦精灵 跨平台AI提示词管理工具 - Microsoft Edge AddonsMake Microsoft Edge your own with extensions that help you personalize the browser and be more productive.https://microsoftedge.microsoft.com…

GpuGeek 网络加速:破解 AI 开发中的 “最后一公里” 瓶颈

摘要&#xff1a; 网络延迟在AI开发中常被忽视&#xff0c;却严重影响效率。GpuGeek通过技术创新&#xff0c;提供学术资源访问和跨国数据交互的加速服务&#xff0c;助力开发者突破瓶颈。 目录 一、引言&#xff1a;当算力不再稀缺&#xff0c;网络瓶颈如何破局&#xff1f; …

校园社区小程序源码解析

基于ThinkPHP、FastAdmin和UniApp开发的校园社区小程序源码&#xff0c;旨在为校园内的学生和教职员工提供一个便捷的在线交流和服务平台。 该小程序前端采用UniApp进行开发&#xff0c;具有良好的跨平台兼容性&#xff0c;可以轻松发布到iOS和Android平台。同时&#xff0c;后…

【Elasticsearch】flattened`类型在查询嵌套数组时可能返回不准确结果的情况

好的&#xff01;为了更清楚地说明flattened类型在查询嵌套数组时可能返回不准确结果的情况&#xff0c;我们可以通过一个具体的例子来展示。这个例子将展示如何在文档中没有完全匹配的嵌套对象时&#xff0c;flattened类型仍然可能返回该文档。 示例文档结构 假设你有以下文…

【目标检测】RT-DETR

DETRs Beat YOLOs on Real-time Object Detection DETR在实时目标检测任务中超越YOLO CVPR 2024 代码地址 论文地址 0.论文摘要 YOLO系列因其在速度与精度间的均衡权衡&#xff0c;已成为实时目标检测领域最受欢迎的框架。然而我们观察到&#xff0c;非极大值抑制&#xf…

笔试强训:Day5

一、笨小猴&#xff08;哈希数学&#xff09; 笨小猴_牛客题霸_牛客网 #include <iostream> #include <cmath> using namespace std; string s; bool isprime(int x){//试除法if(x2) return true;if(x<2||x%20) return false;int nsqrt(x);for(int i3;i<n;i…

掌握 LangChain 文档处理核心:Document Loaders 与 Text Splitters 全解析

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是LangChain 2、LangChain 在智能应用中的作用 …

开发工具指南

后端运维场用工具 工具文档简介1panel安装指南运维管理面板网盘功能介绍网盘jenkins可以通过1panel 进行安装jpom辅助安装文档后端项目发布工具

拷贝构造函数如果不加引用会怎样?

博主介绍&#xff1a;程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x1…

UE5中制作动态数字Decal

在进行城市道路编辑时&#xff0c;经常需要绘制人行道、交通标志、停车线等路面元素。如果能够使用具有动态修改功能的 Decal&#xff08;贴花&#xff09;&#xff0c;将大大提升编辑效率和灵活性。接下来讲解如何制作。 1.首先准备一张包含所需元素的Texture&#xff0c;这里…

【Leetcode 每日一题】2900. 最长相邻不相等子序列 I

问题背景 给你一个下标从 0 0 0 开始的字符串数组 w o r d s words words&#xff0c;和一个下标从 0 0 0 开始的 二进制 数组 g r o u p s groups groups&#xff0c;两个数组长度都是 n n n。 你需要从 w o r d s words words 中选出 最长子序列。如果对于序列中的任何…