【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.pswp.cn/pingmian/81056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81056.shtml
英文地址,請注明出處:http://en.pswp.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 中選出 最長子序列。如果對于序列中的任何…