CGI是“公共网关接口”(Common Gateway Interface)的缩写,它是一个标准,定义了Web服务器与脚本解释器之间的接口。通过CGI,Web服务器可以调用外部脚本解释器,将用户的请求传递给脚本,脚本计算出结果后,把结果返回给Web服务器,由Web服务器将结果发回给用户。
CGI脚本必须可执行,通常是编写一段程序,比如Python,Perl,C语言等程序。Web服务器会调用这个程序,将HTTP请求传递给它。该程序相当于一个网页与后端数据交互的接口。
下面是一个最简单的Python CGI程序实现,该程序会返回一个HTML页面:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- print("Content-type:text/html\r\n\r\n") print("") print("") print("Hello World from CGI ") print("") print("") print("Hello World! This is my first CGI program
") print("") print("")
在上面的程序中,第一行声明了程序使用python3作为解释器,第二行声明了编码为UTF-8。接下来就是一些HTML的标签。
表单(form)是HTML的一个重要元素,它可以和CGI进行交互。下面是一个简单的表单,其中包含一个文本框和一个提交按钮:
上面的表单指定了action为"/cgi-bin/form.py",method为post,这意味着它会向CGI脚本发送一个POST请求。表单中的文本框的值会被命名为name,它将作为POST请求的参数发送到后端脚本中。
下面是一个Python CGI脚本,它能够读取表单参数,并返回一个包含参数内容的HTML页面:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- import cgi form = cgi.FieldStorage() name = form.getvalue('name') print("Content-type:text/html\r\n\r\n") print('') print('') print('Hello World from CGI ') print('') print('') print('Hello %s! This is my first CGI program
' % (name if name else 'World')) print('') print('')
在上面的代码中,我们从CGI的FieldStorage中读取了表单参数的值,并使用字符串格式化函数构造了一个包含参数内容的HTML页面。
通过CGI,我们可以上传文件到后端的服务器。HTML提供了一个input元素,它的类型(type)为file,当用户点击该元素时,系统会跳出一个文件选择对话框,用户可以选择需要上传的文件。
上面的代码指定了form的method为POST,并且enctype为multipart/form-data,这样做可以支持文件上传。用户上传的文件会在后端脚本的FieldStorage对象中以文件的形式存储。
接下来是一个Python CGI脚本,它能够读取用户上传的文件,并将文件内容返回到HTML页面中:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- import cgi form = cgi.FieldStorage() file_item = form['file'] if file_item.filename: with open('/tmp/uploaded_file', 'wb') as fout: fout.write(file_item.file.read()) print("Content-type:text/html\r\n\r\n") print('') print('') print('File uploaded ') print('') print('') print('File uploaded successfully!
') if file_item.filename: print('Filename: %s
' % file_item.filename) print('Contents:
') print('') with open('/tmp/uploaded_file', 'rb') as fin: content = fin.read().decode('utf-8') print(html.escape(content)) print('') else: print('No file uploaded
') print('') print('')
Filename: %s
Contents:
') with open('/tmp/uploaded_file', 'rb') as fin: content = fin.read().decode('utf-8') print(html.escape(content)) print('
No file uploaded
上面的代码中,我们获取了表单中的file元素,并打开一个本地文件,将上传的文件内容写入该文件。接着,我们使用字符串格式化函数构造了一个包含文件名和文件内容的HTML页面。
标签: 心情