「Python系列」Python CGI编程

本文涉及的产品
性能测试 PTS,5000VUM额度
容器镜像服务 ACR,镜像仓库100个 不限时长
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: CGI(Common Gateway Interface)是一种用于Web服务器与应用程序之间进行通信的协议。使用CGI,你可以编写脚本(通常是Python脚本)来处理Web请求,并生成动态网页内容。

一、Python CGI编程

CGI(Common Gateway Interface)是一种用于Web服务器与应用程序之间进行通信的协议。使用CGI,你可以编写脚本(通常是Python脚本)来处理Web请求,并生成动态网页内容。

下面是一个简单的Python CGI示例,用于处理GET请求并显示一个欢迎消息:

  1. 首先,确保你的Web服务器支持CGI。常见的Web服务器如Apache和Nginx都支持CGI。
  2. 创建一个Python脚本文件,例如hello.py,并添加以下内容:
#!/usr/bin/env python3

print("Content-type: text/html")
print()

print("<html>")
print("<head>")
print("<title>Hello World</title>")
print("</head>")
print("<body>")
print("<h1>Hello, World!</h1>")
print("</body>")
print("</html>")

这个脚本首先输出一个Content-type头部,告诉Web服务器它要发送的内容类型是HTML。然后,它输出一个简单的HTML页面,其中包含一个标题为"Hello, World!"的标题。

  1. hello.py脚本文件放置在你的Web服务器的CGI目录中。这个目录通常是一个特定的文件夹,用于存放CGI脚本。具体的位置取决于你的Web服务器配置。
  2. 配置你的Web服务器以允许执行CGI脚本。这通常涉及编辑Web服务器的配置文件,并指定CGI目录的路径。具体的配置方法取决于你使用的Web服务器。
  3. 在Web浏览器中访问你的CGI脚本的URL。例如,如果你的Web服务器是Apache,并且CGI目录位于/var/www/cgi-bin/,那么你可以通过访问http://yourserver.com/cgi-bin/hello.py来执行hello.py脚本。

这只是一个简单的示例,用于演示如何使用Python编写CGI脚本。你可以根据需要扩展这个示例,处理更复杂的Web请求,生成更复杂的网页内容,并与数据库进行交互等。

请注意,CGI是一种较老的Web编程技术,现在通常被更现代的框架和工具(如Flask、Django等)所取代。如果你正在开始一个新的Web项目,建议考虑使用这些更现代的工具。

二、HTTP头部

HTTP头部(HTTP Headers)是HTTP请求和响应中的重要组成部分,它们包含了关于HTTP请求或响应的附加信息。这些头部信息以键值对的形式出现,用于描述HTTP消息(请求或响应)的特性,如内容类型、发送方、接收方、缓存指令、编码方式等。

以下是一些常见的HTTP头部字段及其描述:

请求头部(Request Headers)

  • Host: 指定请求的目标主机名和端口号。
  • User-Agent: 标识发出请求的浏览器或客户端类型。
  • Accept: 客户端愿意接收的媒体类型(如text/html, application/json等)。
  • Accept-Language: 客户端偏好的自然语言版本。
  • Accept-Encoding: 客户端支持的内容编码类型(如gzip, deflate等)。
  • Connection: 控制是否应保持网络连接。
  • Referer: 发起请求的页面的URL,用于追踪请求来源。
  • Authorization: 认证信息,如用户名和密码,用于身份验证。
  • Cookie: 存储在客户端的会话或持久性数据。

响应头部(Response Headers)

  • Content-Type: 响应内容的媒体类型(如text/html, application/json等)。
  • Content-Length: 响应内容的长度(以字节为单位)。
  • Server: 响应的服务器类型。
  • Last-Modified: 资源最后修改的时间。
  • Cache-Control: 控制缓存行为的指令。
  • Expires: 响应的过期时间。
  • Set-Cookie: 服务器发送给客户端的cookie。
  • Location: 用于重定向的URL。
  • WWW-Authenticate: 认证方式,用于响应401未授权请求。

示例

以下是一个HTTP请求和响应中包含头部的简单示例:

请求(Request)

GET /hello.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8
Connection: keep-alive

响应(Response)

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 132
Connection: keep-alive
Server: Apache/2.4.25 (Unix) OpenSSL/1.0.2j
Last-Modified: Tue, 12 Dec 2017 03:24:29 GMT
ETag: "5a2d1c4d-84"
Accept-Ranges: bytes

在实际应用中,HTTP头部字段可以非常多样化和复杂,具体取决于使用的HTTP版本、协议扩展以及特定应用的需求。在编写CGI脚本时,你可以使用Python的print函数来输出所需的HTTP头部,然后发送实际的HTML内容。例如:

#!/usr/bin/env python3

# 设置HTTP头部
print("Content-type: text/html")
print()  # 空行标志着头部的结束和正文的开始

# 输出HTML内容
print("<html>")
print("<head>")
print("<title>CGI Example</title>")
print("</head>")
print("<body>")
print("<h1>Hello, CGI!</h1>")
print("</body>")
print("</html>")

在这个例子中,Content-type: text/html头部告诉浏览器响应的内容是HTML文档。空行之后是HTML文档的实际内容。

三、CGI环境变量

CGI(Common Gateway Interface)环境变量是Web服务器传递给CGI脚本的一系列变量,这些变量包含了关于HTTP请求和服务器环境的信息。CGI脚本可以使用这些环境变量来获取关于客户端请求、服务器状态以及其他重要信息的数据。

以下是一些常见的CGI环境变量及其描述:

  1. CONTENT_TYPE:
  • 描述:表示客户端发送的数据的MIME类型(例如,application/x-www-form-urlencoded 表示表单数据)。
  • 用途:CGI脚本可以使用这个变量来确定如何解析客户端发送的数据。
  1. CONTENT_LENGTH:
  • 描述:表示客户端发送的数据的长度(字节数)。
  • 用途:用于读取和处理来自客户端的数据时,知道需要读取多少字节。
  1. REQUEST_METHOD:
  • 描述:表示客户端使用的HTTP请求方法(如GET、POST等)。
  • 用途:CGI脚本可以使用这个变量来决定如何处理请求,因为不同的请求方法可能需要不同的处理逻辑。
  1. QUERY_STRING:
  • 描述:表示URL中查询字符串的部分(即问号?之后的部分)。
  • 用途:通常用于传递参数给CGI脚本。
  1. REMOTE_ADDR:
  • 描述:表示发出请求的客户端的IP地址。
  • 用途:用于记录、日志或安全验证等。
  1. REMOTE_HOST:
  • 描述:表示发出请求的客户端的主机名。
  • 用途:与REMOTE_ADDR类似,但提供的是主机名而不是IP地址。
  1. REMOTE_USER:
  • 描述:如果Web服务器启用了身份验证,这个变量将包含经过身份验证的用户的用户名。
  • 用途:用于在CGI脚本中识别已验证的用户。
  1. SERVER_NAME:
  • 描述:表示服务器的主机名或IP地址。
  • 用途:用于构建绝对URL或进行其他需要服务器名称的操作。
  1. SERVER_SOFTWARE:
  • 描述:表示服务器的软件名称和版本。
  • 用途:用于日志记录或调试,以了解哪个服务器软件正在处理请求。
  1. GATEWAY_INTERFACE:
    • 描述:表示CGI规范的版本。
    • 用途:用于确保CGI脚本与服务器遵循相同版本的规范。

在Python中,可以通过os.environ字典来访问这些环境变量。例如,要获取REMOTE_ADDR环境变量的值,可以使用os.environ.get('REMOTE_ADDR')

这些环境变量是CGI规范的一部分,并由Web服务器在调用CGI脚本时自动设置。因此,不同的Web服务器可能会有不同的环境变量集或稍有不同的变量名,但上述列表涵盖了大多数常见的环境变量。

四、CGI中使用Cookie

在CGI中使用Cookie可以帮助Web应用程序在客户端存储和检索信息。Cookie是一种存储在用户浏览器中的小型数据片段,通常用于跟踪用户会话、个性化内容或存储用户的偏好设置。

要在CGI脚本中使用Cookie,你需要执行以下步骤:

  1. 设置Cookie:
    在你的CGI脚本中,通过HTTP响应头部设置Cookie。这通常是通过Set-Cookie头部来完成的。例如,要设置一个名为username的Cookie,其值为john_doe,你可以这样做:
print("Set-Cookie: username=john_doe; path=/")

这里,path=/意味着Cookie将适用于服务器的整个域。如果你只想让Cookie在某个特定的目录下可用,你可以更改路径。

  1. 读取Cookie:
    当用户下次访问你的网站时,浏览器会自动发送之前设置的所有Cookie。你可以在CGI脚本中使用os.environ字典来读取这些Cookie。HTTP_COOKIE环境变量包含了客户端发送的所有Cookie,它们以分号(;)分隔。
import os

# 读取HTTP_COOKIE环境变量
cookie_string = os.environ.get('HTTP_COOKIE', '')

# 解析Cookie字符串
cookies = {
   }
for cookie in cookie_string.split(';'):
   key, value = cookie.strip().split('=', 1)
   cookies[key] = value

# 现在你可以使用cookies字典来访问Cookie的值
username = cookies.get('username', '')

注意,解析Cookie字符串时要小心,因为用户可能发送了多个Cookie,并且它们可能包含特殊字符或编码。

  1. 更新或删除Cookie:
    要更新Cookie的值,你可以再次发送一个Set-Cookie头部,但这次要包含新的值。要删除Cookie,你可以发送一个Set-Cookie头部,但其值设置为空,并添加一个Expires属性,设置为一个过去的日期。
# 更新Cookie
print("Set-Cookie: username=new_value; path=/")

# 删除Cookie
print("Set-Cookie: username=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/")
  1. 安全性:
    当使用Cookie时,特别是存储敏感信息时,安全性是一个重要的问题。你应该确保Cookie只包含必要的信息,并且使用了适当的加密措施(如HTTPS)来保护它们的传输。另外,对于敏感信息,通常更好的做法是使用服务器端的会话管理,而不是依赖客户端的Cookie。
  2. 遵守隐私法规:
    在使用Cookie时,要遵守相关的隐私法规,特别是GDPR(通用数据保护条例)等。确保你向用户明确说明了Cookie的用途,并提供了禁用它们的方法。

记住,尽管Cookie提供了一种方便的方式来在客户端存储信息,但它们并不是最安全的方式。对于需要高度安全的数据,最好使用服务器端的会话管理或数据库来存储这些信息。

五、相关链接

  1. Python下载安装中心
  2. Python官网
  3. Python软件下载
  4. 「Python系列」Python简介及案例
  5. 「Python系列」Python基础语法/数据类型
  6. 「Python系列」Python解释器
  7. 「Python系列」Python运算符
  8. 「Python系列」Python数据结构
  9. 「Python系列」Python元组
  10. 「Python系列」Python集合
  11. 「Python系列」Python列表
相关文章
|
2天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
2天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
4天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
3天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。
|
2天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
3天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
4天前
|
人工智能 数据挖掘 程序员
Python编程入门:从零到英雄
【10月更文挑战第37天】本文将引导你走进Python编程的世界,无论你是初学者还是有一定基础的开发者,都能从中受益。我们将从最基础的语法开始讲解,逐步深入到更复杂的主题,如数据结构、面向对象编程和网络编程等。通过本文的学习,你将能够编写出自己的Python程序,实现各种功能。让我们一起踏上Python编程之旅吧!
|
5天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
6天前
|
设计模式 程序员 数据处理
编程之旅:探索Python中的装饰器
【10月更文挑战第34天】在编程的海洋中,Python这艘航船以其简洁优雅著称。其中,装饰器作为一项高级特性,如同船上的风帆,让代码更加灵活和强大。本文将带你领略装饰器的奥秘,从基础概念到实际应用,一起感受编程之美。
|
5天前
|
分布式计算 并行计算 大数据
Python编程中的高效数据处理技巧
Python编程中的高效数据处理技巧
14 0