📅  最后修改于: 2023-12-03 14:46:33.022000             🧑  作者: Mango
CGI(通用网关接口)是一种使用请求-响应模式来让web服务器运行外部程序的标准。在python中,我们可以使用CGI编程来创建动态网站和web应用程序。本文将介绍CGI编程的基础知识和使用方法。
CGI编程的工作原理如下:
在Python中,我们使用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><a href='test.html'>点击这里</a></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.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编程时,有一些事项需要注意。下面列出其中的几点:
Content-type
属性,指定响应类型,如text/html
、text/plain
等。CGI编程是一种常用的创建动态网站和web应用程序的方式,Python中的cgi
模块提供了一些函数和类帮助我们进行CGI编程。我们需要注意CGI编程的工作原理、常用函数和类以及一些注意事项,才能开发出安全、高效的CGI程序。