Python CGI编程


Python CGI编程

简介

CGI是一种通用网关接口,它允许Web服务器和CGI程序进行通信。Python的CGI模块允许程序员编写CGI脚本,它提供了处理HTTP请求和响应的支持。

环境配置

为了能够运行Python CGI程序,您需要一个支持CGI的Web服务器。例如,Apache服务器就支持CGI。

在Apache服务器中启用CGI需要修改httpd.conf文件。在该文件中添加以下行:

LoadModule cgi_module modules/mod_cgi.so
AddHandler cgi-script .cgi .py

接着,你需要找到web服务器中的DocumentRoot,这是网站目录,所有存在于DocumentRoot中的脚本都可以作为CGI执行。例如:

DocumentRoot "/Library/WebServer/Documents/"

最后,你需要创建一个CGI目录,并将其添加到路径中,例如,如果你将CGI目录放在DocumentRoot下,则需要添加以下行:

ScriptAlias /cgi-bin/ /Library/WebServer/Documents/cgi-bin/

现在,你可以将Python脚本重命名为.py文件,并将其放在cgi-bin目录中,通过localhost/cgi-bin/your-script.py来访问该脚本。

CGI上下文

在编写Python CGI程序时,您需要了解CGI上下文。下面是一些常见的上下文变量:

  • CONTENT_TYPE:如果存在请求正文,则为数据格式。例如,text/plain或application/json。
  • CONTENT_LENGTH:如果存在请求正文,则为请求正文的长度,以字节为单位。
  • HTTP_COOKIE:如果存在cookie,则为它们的字符串表示形式。
  • HTTP_USER_AGENT:客户端浏览器的User Agent字符串。

在Python脚本中,可以使用os.environ获取CGI上下文。

处理表单数据

在CGI编程中,经常需要从HTML表单收集数据。Python CGI模块提供了FieldStorage类来处理表单数据。下面是一个简单的表单处理程序,它从HTML表单中获取username和password:

#!/usr/bin/python3

import cgi 

form = cgi.FieldStorage()

# Get data from the HTML form
username = form.getvalue('username')
password = form.getvalue('password')

print("Content-type: text/html\r\n\r\n")
print("<html>")
print("<head>")
print("<title>Form Data</title>")
print("</head>")
print("<body>")
print("<h2>Form Data</h2>")
print("<p>Username: " + username + "</p>")
print("<p>Password: " + password + "</p>")
print("</body>")
print("</html>")

可以使用curl或浏览器在终端上测试该脚本:

curl -d "username=admin&password=secret" http://localhost/cgi-bin/form.py

处理GET和POST请求

Python CGI模块允许您处理GET和POST请求。GET请求使用查询字符串传递参数,而POST请求将表单数据包含在请求正文中。下面是一个示例程序,它演示了如何处理GET和POST请求:

#!/usr/bin/python3

import cgi
import cgitb
cgitb.enable()

print("Content-type: text/html\r\n\r\n")

# Get data from the query string (GET request)
query_string = os.environ.get('QUERY_STRING')
if query_string:
    print("<h1>GET Request</h1>")
    print("<p>" + query_string + "</p>")

# Get data from the form data (POST request)
form_data = cgi.FieldStorage()
if form_data:
    print("<h1>POST Request</h1>")
    for key in form_data.keys():
        print("<p>" + key + ": " + form_data[key].value + "</p>")

处理上传文件

处理上传文件与处理表单数据相似,只需设置enctype属性为multipart/form-data,然后使用Python CGI模块的FieldStorage方法来处理文件。以下是一个示例程序:

<!DOCTYPE html>
<html>
<head>
    <title>File Upload</title>
</head>
<body>
    <h2>File Upload</h2>
    <form action="/cgi-bin/upload.py" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <input type="submit" value="Upload" />
    </form>
</body>
</html>
#!/usr/bin/python3

import cgi
import cgitb
cgitb.enable()

print("Content-type: text/html\r\n\r\n")

uploaded_file = cgi.FieldStorage().getfirst('file')
if uploaded_file:
    print("<h1>File Upload</h1>")
    print("<p>" + uploaded_file + "</p>")

上传文件时,浏览器会发送POST请求,因此我们需要使用POST条件来处理上传的文件。您还需要设置enctype属性为multipart/form-data,以便正确处理文件。

总结

Python CGI编程允许我们编写Web应用程序来接受HTTP请求并响应。使用Python CGI模块,我们可以轻松处理表单数据、GET和POST请求以及上传文件。此外,CGI脚本可以在任何支持CGI的Web服务器上运行,例如Apache服务器。