6. Python脚本学习实战笔记六 使用CGI远程编辑
本篇名言:“茶_苦而后甘,令人回味;酒_绵而后劲,叫人道爽;泉_清而味淡,却用一生来品出甜。一个知音,如茶如酒如泉,让人受益一生。”
1. 需求
通过网络在其他机器上对其进行修改,这样可以养数个协同作者一起修改共享文档,不用担心同步问题。(PS:这类远程编辑功能是WIKI系统的核心机制之一)。
2. 工具及准备
使用Python 的CGI模块,以及调试用的cgitb模块。
3. 初次实现
l 默认使用数据文件的值获取CGI的text参数
l 将文本保存到数据文件中
l 打印表单,将文本显示在文本域中
simple_edit.cgi文件如下:
#!D:\python27\python.exe
importcgi
form = cgi.FieldStorage()
text = form.getvalue('text', open('simple_edit.dat').read())
f = open('simple_edit.dat', 'w')
f.write(text)
f.close()
print"""Content-type: text/html
<html>
<head>
<title>A Simple Editor</title>
</head>
<body>
<form action='simple_edit.cgi'method='POST'>
<textarea rows='10' cols='20'name='text'>%s</textarea><br />
<input type='submit' />
</form>
</body>
</html>
""" % text
simple_edit.dat文件:
随意输入一些即可。
然后将simple_edit.cgi文件和simple_edit.dat文件放入到httpd服务的cgi-bin目录下(具体可以参看,蛤蟆之前的CGI脚本笔记)
http://127.0.0.1/cgi-bin/simple_edit.cgi
出现如下:输入提交后,内容会保存到simple_edit.dat文件中。
图1
4. 重构
将CGI脚本拆分为3个:一个带有能输入文件名的表单的网页index.html,在文本域中显示给定文件的脚本edit.cgi,保存收到的文本到给定文件的脚本save.cgi。
4.1 创建文件表单
Index.html 是HTML文件,用于输入文件名的表单。在文本框中输入文件名,点击打开按钮就可以运行edit.cgi.
4.2 创建编辑器脚本
Edit.cgi显示网页,还有一个用于输入密码的文本框。
脚本如下:
#!D:\python27\python.exe
print'Content-type: text/html\n'
fromos.path import join, abspath
importcgi, sys
BASE_DIR = abspath('data')
form = cgi.FieldStorage()
filename = form.getvalue('filename')
ifnot filename:
print'Please enter a file name'
sys.exit()
text = open(join(BASE_DIR,filename)).read()
print"""
<html>
<head>
<title>Editing...</title>
</head>
<body>
<form action='save.cgi'method='POST'>
<b>File:</b> %s<br />
<input type='hidden' value='%s'name='filename' />
<b>Password:</b><br />
<input name='password' type='password'/><br />
<b>Text:</b><br />
<textarea name='text' cols='40'rows='20'>%s</textarea><br />
<input type='submit' value='Save'/>
</form>
</body>
</html>
""" % (filename, filename, text)
Abspath函数被用于获取data目录的绝对路径,文件名保存在hidden表单元素中。会被传递到下一个脚本save.cgi中。
4.3 编写保存脚本
接受一个文件名、一个密码和一些文本,并且检查密码是是否正确。
实现如下:
#!D:\python27\python.exe
print'Content-type: text/html\n'
fromos.path import join, abspath
importcgi, sha, sys
BASE_DIR = abspath('data')
form = cgi.FieldStorage()
text = form.getvalue('text')
filename = form.getvalue('filename')
password = form.getvalue('password')
ifnot (filename and text and password):
print'Invalid parameters.'
sys.exit()
ifsha.sha(password).hexdigest() != '8843d7f92416211de9ebb963ff4ce28125932878':
print'Invalid password'
sys.exit()
f = open(join(BASE_DIR,filename), 'w')
f.write(text)
f.close()
print'The file has been saved.'
密码处理可以使用SHA模块,SecureHash Algorithm 安全哈希算法。
使用sha用法如下:
>>> from sha import sha
>>> sha('foobar').hexdigest()
'8843d7f92416211de9ebb963ff4ce28125932878'
>>> sha('foobar').hexdigest()
'8843d7f92416211de9ebb963ff4ce28125932878'
>>> sha('foobaz').hexdigest()
'21eb6533733a5e4763acacd1d45a60c2e0e404e1'
5. 交付
将edit.cgi,save.cgi放入到cgi-bin文件夹中。
将index.html翻入到htdocs文件夹中。
在cgi-bin文件夹中创建data文件。
将simple_edit.dat放入到data文件夹中。
然后在浏览器中输入 127.0.0.1 即可调出index.html。
如下图2:
输入data中的文件simple_edit.dat然后点击open,出现如下图3:
密码是foobar,然后修改后点击save,出现
The file hasbenn saved.
只有正确输入密码才能进行修改,不然save.cgi会提示 参数错误。