“人生苦短,我用Python”,这句话很好的诠释了Python这种编程语言的强大性。Python是一种脚本解释性语言,可以边运行,边解释。Python的应用领域也非常广泛,比较常用的还是在web方面的各种开发,基于Python也产生了许多的优秀web框架,谈到web开发,就不得不提到一个名词:“CGI”。
什么是CGI
CGI(Common Gateway Interface)也叫通用网关接口,它是一个web服务器主机提供信息服务的标准接口,只要遵循这个接口,web服务器就能获取客户端提交的信息,转交给服务端的CGI程序进行处理,然后将处理结果返回给客户端。CGI通讯是由两部分组成的:一部分是用户的浏览器显示的页面,也就是html页面,另一部分则是运行在服务器上的CGI程序。它们之间的通讯方式如下图所示:
CGI其实就是连通HTTP服务器和其他资源(如数据库、文件系统)的一个通道,也是一个接口规范,所以它的学名就叫做通用网关接口。
那么,从网页端访问一个页面(url)后,这个过程是怎么处理的呢?
首先,这个请求会通过网页端浏览器发送到HTTP服务器,然后HTTP服务器根据发过来的请求会解析URL,并找到对应的文件,如果文件存在,则通过HTTP服务器返回正确的结果,反之,则返回错误,结果返回到浏览器后,由浏览器展示出相应的页面文件或数据,这样一个请求就完成了。
CGI程序可以用许多编程语言来写,通常有C、C++,还可以是Python脚本,PERL脚本等。今天我们准备用Python做一个最简单的CGI小程序。
Web服务器环境搭建(windows)
在写程序之前,我们要先搭建一个web服务器,好在Python3.x自带了一个cgi服务器,现在我们将它跑起来;
ps:由于我是在windows下安装的Python,所以,以下的环境都是在windows下运行的哦;
1. 首先,在你的电脑里找一个目录,新建一个文件夹,叫做“www”,在“www”文件夹下面新建一个目录,叫做“cgi-bin”,我直接建立在了d盘的根目录下;
2. 使用管理员打开cmd命令行工具,进入到你刚才的“www”目录下,注意:是“www”目录;
3. 敲命令“python -m http.server --cgi 8001”将服务器开启,注意:端口8001是可以随意指定的,但是不能与电脑上已经打开的端口冲突,打开正确后显示如下的界面,如果不正确,多半是端口有冲突了,换一个端口就可以了;
4. 好了,服务已经开启了,就是这么简单!现在让我们打开浏览器,在浏览器里输入如下图所示的地址,敲回车访问一下试试看,如果弹出来如下的页面,就表示服务器已经正常工作了:
在页面上多刷新几次试试?可以在命令行窗口看到信息:
好了,我们开始着手用Python写第一个CGI程序了!
第一个程序
打开我们一直用的PyCharm,在里面编辑代码,如下图所示:
#coding=utf-8
print("Content-type: text/html \n\n")
print("hello world")
我们将这个文件取一个名字,叫做“hello.py”,并把它保存在刚才我们的d:\www\cgi-bin目录下。这个文件一共只有三行数据。
第一行指出了编码格式是“UTF-8”;
第二行的意思是:告诉浏览器,浏览这个文件的类型是text,其中Content-type是HTTP头的一部分;
第三行就是正文,显示出“Hello World”;
将这个文件保存后,让我们打开浏览器,访问一下这个文件看看;
请注意:在浏览器的地址栏里输入的文件名代表将要访问的文件,展示的结果将在浏览器页面上展示出来,是不是很简单?没错,这正是编程的乐趣所在!
GET和POST方法
浏览器客户端通过两种方法向服务器传递信息,这两种方法就是 GET 方法和 POST 方法。
使用GET方法传输数据
GET方法发送编码后的用户信息到服务端,数据信息包含在请求页面的URL上,以"?"号分割, 如下所示:
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
有关 GET 请求的其他一些注释:
GET 请求可被缓存
GET 请求保留在浏览器历史记录中
GET 请求可被收藏为书签
GET 请求不应在处理敏感数据时使用
GET 请求有长度限制
GET 请求只应当用于取回数据
简单的url实例:GET方法
以下是一个简单的URL,使用GET方法向hello_get.py程序发送两个参数:
/cgi-bin/test.py?name=W3Cschool教程&url=http://www.w3cschool.cn
以下为hello_get.py文件的代码:
#coding=utf-8
# CGI处理模块
import cgi, cgitb
# 创建 FieldStorage 的实例化
form = cgi.FieldStorage()
# 获取数据
site_name = form.getvalue('name')
site_url = form.getvalue('url')
print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print ("<title>W3Cschool教程 CGI 测试实例</title>")
print ("</head>")
print ("<body>")
print ("<h2>%s官网:%s</h2>" % (site_name, site_url))
print ("</body>")
print ("</html>")
简单的表单实例:GET方法
以下是一个通过HTML的表单使用GET方法向服务器发送两个数据,提交的服务器脚本同样是hello_get.py文件,hello_get.html 代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>W3Cschool教程(w3cschool.cn)</title>
</head>
<body>
<form action="/cgi-bin/hello_get.py" method="get">
站点名称: <input type="text" name="name"> <br />
站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>
Gif 演示如下所示:
使用POST方法传递数据
使用POST方法向服务器传递数据是更安全可靠的,像一些敏感信息如用户密码等需要使用POST传输数据。
以下同样是hello_get.py ,它也可以处理浏览器提交的POST表单数据:
#coding=utf-8
# CGI处理模块
import cgi, cgitb
# 创建 FieldStorage 的实例化
form = cgi.FieldStorage()
# 获取数据
site_name = form.getvalue('name')
site_url = form.getvalue('url')
print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print ("<title>W3Cschool教程 CGI 测试实例</title>")
print ("</head>")
print ("<body>")
print ("<h2>%s官网:%s</h2>" % (site_name, site_url))
print ("</body>")
print ("</html>")
以下为表单通过POST方法(method="post")向服务器脚本 hello_get.py 提交数据:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>W3Cschool教程(w3cschool.cn)</title>
</head>
<body>
<form action="/cgi-bin/hello_get.py" method="post">
站点名称: <input type="text" name="name"> <br />
站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>
</form>
Gif 演示如下所示: