编写Python CGI脚本的教程


Posted in Python onJune 29, 2015

你是否想使用Python语言创建一个网页,或者处理用户从web表单输入的数据?这些任务可以通过Python CGI(公用网关接口)脚本以及一个Apache web服务器实现。当用户请求一个指定URL或者和网页交互(比如点击""提交"按钮)的时候,CGI脚本就会被web服务器启用。CGI脚本调用执行完毕后,它的输出结果就会被web服务器用来创建显示给用户的网页。
配置Apache web服务器,让其能运行CGI脚本

在这个教程里,我们假设Apache web服务器已经安装好,并已运行。这篇教程使用的Apache web服务器(版本2.2.15,用于CentOS发行版6.5)运行在本地主机(127.0.0.1),并且监听80端口,如下面的Apache指令指定一样:

   

ServerName 127.0.0.1:80

    Listen 80

下面举例中的HTML文件存放在web服务器上的/var/www/html目录下,并通过DocumentRoot指令指定(指定网页文件所在目录):

   

DocumentRoot "/var/www/html"

现在尝试请求URL:http://localhost/page1.html

这将返回web服务器中下面文件的内容:

   

/var/www/html/page1.html

为了启用CGI脚本,我们必须指定CGI脚本在web服务器上的位置,需要用到ScriptAlias指令:

   

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

以上指令表明CGI脚本保存在web服务器的/var/www/cgi-bin目录,请求URL里包含/cgi-bin/的将会搜索这个目录下的CGI脚本。

我们必须还要明确CGI脚本在/var/www/cgi-bin目录下有执行权限,还要指定CGI脚本的文件扩展名。使用下面的指令:

<Directory "/var/www/cgi-bin">
  Options +ExecCGI
  AddHandler cgi-script .py
 </Directory>

下面访问URL:http://localhost/cgi-bin/myscript-1.py

这将会调用web服务器中下面所示脚本:

   

/var/www/cgi-bin/myscript-1.py

创建一个CGI脚本

在创建一个Python CGI脚本之前,你需要确认你已经安装了Python(这通常是默认安装的,但是安装版本可能会有所不同)。本篇教程使用的脚本是使用Python版本2.6.6编写的。你可以通过下面任意一命令(-V和--version参数将显示所安装Python的版本号)检查Python的版本。

$ python -V
 $ python --version

如果你的Python CGI脚本要用来处理用户输入的数据(从一个web输入表单),那么你将需要导入Python cgi模块。这个模块可以处理用户通过web输入表单输入的数据。你可以在你的脚本中通过下面的语句导入该脚本:

import cgi

你也必须修改Python CGI脚本的执行权限,以防止web服务器不能调用。可以通过下面的命令增加执行权限:

# chmod o+x myscript-1.py

Python CGI例子

涉及到Python CGI脚本的两个方案将会在下面讲述:

  •     使用Python脚本创建一个网页
  •     读取并显示用户输入的数据,并且在网页上显示结果

注意:Python cgi模块在方案2中是必需的,因为这涉及到用户从web表单输入数据。
例子1 :使用Python脚本创建一个网页

对于这个方案,我们将通过创建包含一个单一提交按钮的网页/var/www/html/page1.html开始。

<html>
 <h1>Test Page 1</h1>
 <form name="input" action="/cgi-bin/myscript-1.py" method="get">
 <input type="submit" value="Submit">
 </form>
 </html>

当"提交"按钮被点击,/var/www/cgi-bin/myscript-1.py脚本将被调用(通过action参数指定)。通过设置方法参数为"get"来指定一个"GET"请求,服务器将会返回指定的网页。/var/www/html/page1.html在浏览器中的显示情况如下:

编写Python CGI脚本的教程

/var/www/cgi-bin/myscript-1.py的内容如下:

#!/usr/bin/python
 print "Content-Type: text/html"
 print ""
 print "<html>"
 print "<h2>CGI Script Output</h2>"
 print "<p>This page was generated by a Python CGI script.</p>"
 print "</html>"

第一行声明表示这是使用 /usr/bin/python命令运行的Python脚本。"Content-Type: text/html"打印语句是必需的,这是为了让web服务器知道接受自CGI脚本的输出类型。其余的语句用来输出HTML格式的其余网页内容。

当"Submit"按钮点击,下面的网页将返回:

编写Python CGI脚本的教程

这个例子的要点是你可以决定哪些信息可以被CGI脚本返回。这可能包括日志文件的内容,当前登陆用户的列表,或者今天的日期。在你处理时拥有所有python库的可能性是无穷无尽的。
例子2:读取并显示用户输入的数据,并将结果显示在网页上

对于这个方案,我们将通过创建一个含有三个输入域和一个提交按钮的网页/var/www/html/page2.html开始。

<html>
 <h1>Test Page 2</h1>
 <form name="input" action="/cgi-bin/myscript-2.py" method="get">
 First Name: <input type="text" name="firstName"><br>
 Last Name: <input type="text" name="lastName"><br>
 Position: <input type="text" name="position"><br>
 <input type="submit" value="Submit"> 
 </form>
 </html>

当"Submit"按钮点击,/var/www/cgi-bin/myscript-2.py脚本将被执行(通过action参数指定)。/var/www//html/page2.html显示在web浏览器中的图片如下所示(注意,三个输入域已经被填写好了):

编写Python CGI脚本的教程

/var/www/cgi-bin/myscript-2.py的内容如下:

#!/usr/bin/python
 import cgi
 form = cgi.FieldStorage()
 print "Content-Type: text/html"
 print ""
 print "<html>"
 print "<h2>CGI Script Output</h2>"
 print "<p>"
 print "The user entered data are:<br>"
 print "<b>First Name:</b> " + form["firstName"].value + "<br>"
 print "<b>Last Name:</b> " + form["lastName"].value + "<br>"
 print "<b>Position:</b> " + form["position"].value + "<br>"
 print "</p>"
 print "</html>"

正如前面提到,import cgi语句用来确保能够处理用户通过web输入表单输入的数据。web输入表单被封装在一个表单对象中,叫做cgi.FieldStorage对象。一旦开始输出,"Content-Type: text/html"是必需的,因为web服务器需要知道接受自CGI脚本的输出格式。用户输入的数据在包含form["firstName"].value,form["lastName"].value,和 form["position"].value的语句中可以得到。那些中括号中的名称和/var/www/html/page2.html文本输入域中定义的名称参数一致。

当网页上的"Submit"按钮被点击,下面的网页将被返回。

编写Python CGI脚本的教程

这个例子的要点就是你可以很容易地读取并显示用户在web表单上输入的数据。除了以字符串的方式处理数据,你也可以用Python将用户输入的数据转化为可用于数值计算的数字。

Python 相关文章推荐
python 使用get_argument获取url query参数
Apr 28 Python
python 将数据保存为excel的xls格式(实例讲解)
May 03 Python
python 读取鼠标点击坐标的实例
Dec 29 Python
python Pexpect 实现输密码 scp 拷贝的方法
Jan 03 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
python实现远程控制电脑
May 23 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
基于Python爬取爱奇艺资源过程解析
Mar 02 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 Python
python 如何快速复制序列
Sep 07 Python
jupyter使用自动补全和切换默认浏览器的方法
Nov 18 Python
Python访问纯真IP数据库脚本分享
Jun 29 #Python
Python实现把数字转换成中文
Jun 29 #Python
Python中if __name__ == '__main__'作用解析
Jun 29 #Python
django接入新浪微博OAuth的方法
Jun 29 #Python
python链接Oracle数据库的方法
Jun 28 #Python
python写日志封装类实例
Jun 28 #Python
Python实现的简单hangman游戏实例
Jun 28 #Python
You might like
php抓即时股票信息
2006/10/09 PHP
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
JavaScript脚本性能优化注意事项
2008/11/18 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
js制作简易年历完整实例
2015/01/28 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
2015/04/16 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
PHP webshell检查工具 python实现代码
2009/09/15 Python
python入门之语句(if语句、while语句、for语句)
2015/01/19 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
logging level级别介绍
2020/02/21 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
生物科学专业个人求职信范文
2013/12/05 职场文书
社区党员先进事迹
2014/01/22 职场文书
大学应届生的自我评价
2014/03/06 职场文书
经济贸易系求职信
2014/08/04 职场文书
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技