📜  Python中的 CGI 编程(1)

📅  最后修改于: 2023-12-03 14:46:33.022000             🧑  作者: Mango

Python中的CGI编程

CGI(通用网关接口)是一种使用请求-响应模式来让web服务器运行外部程序的标准。在python中,我们可以使用CGI编程来创建动态网站和web应用程序。本文将介绍CGI编程的基础知识和使用方法。

CGI编程的工作原理

CGI编程的工作原理如下:

  1. Web服务器收到客户端的请求。
  2. 服务器解析请求,并将客户端发送的参数和数据组织成一个环境变量字典。
  3. 服务器启动CGI程序,并将环境变量字典作为参数传递给CGI程序。
  4. CGI程序从环境变量中获取客户端发送的参数和数据,并进行相应的处理。
  5. CGI程序将处理后的数据作为标准输出流发送到Web服务器。
  6. Web服务器将CGI程序的输出发送给客户端。
CGI编程的基础知识

在Python中,我们使用cgi模块来进行CGI编程。cgi模块提供了一些函数和类来解析CGI请求、获取客户端发送的参数和数据、生成CGI响应等操作。

cgi模块中的常用函数

cgi.escape(string, quote=True)

将一个字符串中的特殊字符转义,使其可以在HTML或XML中正常显示。其中quote参数表示是否将特殊字符转义成引号和括号等符号。

示例代码:

import cgi

html = "<html><head><title>CGI编程</title></head><body>%s</body></html>"
content = "<p>%s</p>" % cgi.escape("<a href='test.html'>点击这里</a>")
print("Content-type: text/html;charset=utf-8\n")
print(html % content)

输出结果:

<html><head><title>CGI编程</title></head><body><p>&lt;a href=&#39;test.html&#39;&gt;点击这里&lt;/a&gt;</p></body></html>

cgi.FieldStorage()

用于解析客户端发送的GET或POST请求中的参数和数据。返回一个字典对象,其中包含了所有的参数以及其对应的值。

示例代码:

import cgi

form = cgi.FieldStorage()
name = form.getvalue("name")
email = form.getvalue("email")

print("Content-type: text/html;charset=utf-8\n")
print("<html><head><title>CGI编程</title></head><body>")
if name and email:
    print("<p>用户名: %s</p>" % name)
    print("<p>邮箱: %s</p>" % email)
else:
    print("<p>请输入用户名和邮箱</p>")
print("</body></html>")

cgi.print_exception(etype, value[, tb[, file]])

用于输出CGI程序的错误信息。其中etype参数表示错误类型,value参数表示错误对象,tb参数表示错误堆栈,file参数表示输出流。

示例代码:

import cgi

try:
    1/0
except:
    cgi.print_exception()

输出结果:

Content-type: text/html;charset=utf-8

Traceback (most recent call last):
  File "<string>", line 3, in <module>
ZeroDivisionError: division by zero
cgi模块中的常用类

cgi.CGIHTTPRequestHandler

用于处理CGI请求的HTTP请求处理程序,继承自http.server.CGIHTTPRequestHandler类。

示例代码:

import http.server
import socketserver
import cgi

PORT = 8000

class MyRequestHandler(http.server.CGIHTTPRequestHandler):
    cgi_directories = ['/cgi-bin']

    def do_POST(self):
        form = cgi.FieldStorage(fp=self.rfile, headers=self.headers, environ={
            'REQUEST_METHOD': 'POST',
            'CONTENT_TYPE': self.headers['Content-Type'],
        })
        self.send_response(200)
        self.send_header('Content-Type', 'text/html')
        self.end_headers()
        self.wfile.write(b'<html><head><title>CGI post</title></head>')
        self.wfile.write(b'<body><p>')

        for field in form.keys():
            field_item = form[field]
            if field_item.filename:
                data = field_item.file.read()
                file_path = 'files/%s' % field_item.filename
                with open(file_path, 'wb') as f:
                    f.write(data)
                content = '%s uploaded as %s' % (field_item.filename, file_path)
            else:
                content = field_item.value
            self.wfile.write(('<b>%s</b>: %s<br>' % (field, content)).encode('utf-8'))

        self.wfile.write(b'</p></body></html>')

with socketserver.TCPServer(("", PORT), MyRequestHandler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()
CGI编程的注意事项

在进行CGI编程时,有一些事项需要注意。下面列出其中的几点:

  • CGI程序需要可执行权限。
  • 在请求头中添加Content-type属性,指定响应类型,如text/htmltext/plain等。
  • CGI程序需要按照CGI协议接收参数和数据,并输出响应。
  • CGI程序最好不要包含任何打印语句,否则会把打印语句作为响应输出。
  • 为避免SQL注入等安全问题,应该对客户端提交的数据进行严格的校验和过滤。
参考资料
结论

CGI编程是一种常用的创建动态网站和web应用程序的方式,Python中的cgi模块提供了一些函数和类帮助我们进行CGI编程。我们需要注意CGI编程的工作原理、常用函数和类以及一些注意事项,才能开发出安全、高效的CGI程序。