如何创建和使用 Python CGI 脚本
你是否想使用 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 在浏览器中的显示情况如下:
/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"按钮点击,下面的网页将返回:
这个例子的要点是你可以决定哪些信息可以被 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 浏览器中的图片如下所示(注意,三个输入域已经被填写好了):
/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"按钮被点击,下面的网页将被返回。
这个例子的要点就是你可以很容易地读取并显示用户在 web 表单上输入的数据。除了以字符串的方式处理数据,你也可以用 Python 将用户输入的数据转化为可用于数值计算的数字。
结论
本教程演示了如何使用 Python CGI 脚本创建网页并处理用户在网页表单输入的数据。查阅更多关于 Apache CGI 脚本的信息,点击 这里 。查阅更多关于 Python cgi 模块的信息,点击 这里 。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论