python3在windows上CGI的编程

“人生苦短,我用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 演示如下所示:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值