「Python系列」Python CGI编程

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 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列表
相关文章
|
5天前
|
存储 人工智能 数据处理
Python:编程的艺术与科学的完美交融
Python:编程的艺术与科学的完美交融
19 1
|
18小时前
|
数据采集 算法 Python
2024年Python最全python基础入门:高阶函数,小米面试编程题
2024年Python最全python基础入门:高阶函数,小米面试编程题
|
18小时前
|
数据采集 人工智能 前端开发
干货满满,转行逆袭,0编程基础学Python拿高薪offer如何做?都在这里!
干货满满,转行逆袭,0编程基础学Python拿高薪offer如何做?都在这里!
|
3天前
|
Python
10个python入门小游戏,零基础打通关,就能掌握编程基础_python编写的入门简单小游戏
10个python入门小游戏,零基础打通关,就能掌握编程基础_python编写的入门简单小游戏
|
5天前
|
网络协议 Unix Python
Python编程-----网络通信
Python编程-----网络通信
9 1
|
5天前
|
JSON 数据格式 开发者
pip和requests在Python编程中各自扮演着不同的角色
【5月更文挑战第9天】`pip`是Python的包管理器,用于安装、升级和管理PyPI上的包;`requests`是一个HTTP库,简化了HTTP通信,支持各种HTTP请求类型及数据交互。两者在Python环境中分别负责包管理和网络请求。
33 5
|
5天前
|
存储 Python 容器
Python高级编程
Python集合包括可变的set和不可变的frozenset,用于存储无序、不重复的哈希元素。创建集合可使用{}或set(),如`my_set = {1, 2, 3, 4, 5}`。通过add()添加元素,remove()或discard()删除元素,如`my_set.remove(3)`。
17 0
|
5天前
|
测试技术 Python
Python模块化方式编程实践
【5月更文挑战第5天】Python模块化编程提升代码质量,包括:定义专注单一任务的模块;使用`import`导入模块;封装函数和类,明确命名便于重用;避免全局变量降低耦合;使用文档字符串增强可读性;为每个模块写单元测试确保正确性;重用模块作为库;定期维护更新以适应Python新版本。遵循这些实践,可提高代码可读性、重用性和可维护性。
44 2
|
5天前
|
测试技术 调度 索引
python编程中常见的问题
【4月更文挑战第23天】
34 2
|
5天前
|
网络协议 算法 网络架构
Python网络编程之udp编程、黏包以及解决方案、tcpserver
Python网络编程之udp编程、黏包以及解决方案、tcpserver