这一篇教程,我们来完成在线文件编辑这个练习项目的第二阶段。
我们在上一篇教程中,已经了解了CGI的使用,如果大家有兴趣的话,可以尝试实现一个在线留言的功能。
类似下图所示:
注意:这并不是在线聊天的功能,页面不经过刷新是看不到最新留言的。
上方的留言功能允许用户输入昵称,默认显示游客。当留言成功时,新的留言在最上方出现。
此案例源代码在本节资料中获取,下载地址在本文末尾。
接下来,我们回归正题。
第二阶段的内容包括三个文件:index.html、edit.py和save.py。
从文件名上大家就能够理解这三个文件各自的功能。
“index.html”这个文件,是我们要打开的首页。
实际上这么命名是有讲究的,因为在访问Web站点时,如果没有指定访问哪个页面(例如:http://219.142.209.7:8888/),会自动打开站点设置的默认页面,通常情况下默认页面就是“index.html”这个文件。在IIS信息服务管理器中,点击站点名称就能够在窗口中部看到默认页面的设置项。
而edit.py和save.py这两个文件一个是编辑功能的实现,一个是保存功能的实现。
下面,我先通过截图让大家了解要实现的目标。
index页面:
edit页面:
save页面:
有了清晰的目标,才能更好地理解每一段示例代码。
1、创建“index.html”文件
在PyCharm中新建一个HTML文件。
在创建好的文件中会自带一些代码。
这些代码中有一些需要修改,包括:语言类型、字符集和页面标题。
示例代码:
Title
按照上方的注释修改完之后,我们需要添加一些表单标签的代码。
示例代码:
在线文本编辑 请输入文件名称:
新增加的代码是一对标签和其中的内容。
在标签中,我们需要指定属性“action”为“edit.py”,也就是说当这个表单提交时,由“edit.py”这个脚本进行处理。而后面一个属性“method”需要指定数据的提交的方式,默认为“post”,也可以使用“get”。
在两个标签之间,有两个标签,一个是文本框,一个是提交按钮。因为要获取文本框中输入的内容,所以文本框标签中要设置“name”属性,这个属性的值可以自定义,例如这里填入的是“filename”。
2、创建“html.py”文件
前面没有提到创建这个文件。
这个文件作用是什么呢?
我们在上一篇教程中了解到,在CGI脚本中,我们必须要添加指定的语句。
示例代码:
print("Content-Type: text/html")print("")
或者
print("Content-Type: text/html\n")
上述代码是输出头部信息,如果不添加的话,页面会报错无法访问。
但是如果每一个CGI脚本文件都添加的话感觉很麻烦。
所以,我们可以单独创建一个“html.py”文件(必须用这个名称),把上述代码写入。
这样的话,CGI脚本中不添加上述代码也能够正常打开。
注意:此方法未查到相关文档依据,具体原因不明,是小楼无意中的一个发现。如有高手知晓,敬请留言解惑,谢谢!
3、创建“edit.py”文件
“edit.py”文件用于处理“index.html”页面提交的数据。
实际上,是要通过“index.html”页面中输入的文件名打开本地相应的文件。
那么,我们就需要在代码中,对“index.html”页面中文本框的输入进行判断,如果没有输入文件名或没有找到相应的文件都要给出提示,并给出一个能够点击返回的文本链接。
类似下图:
示例代码:
# -*- coding:gbk -*-import cgi,sysform = cgi.FieldStorage()filename = form.getvalue('filename')if not filename: print('请输入一个文件名称!') print('
返回
') sys.exit()try: text = open(filename).read()except FileNotFoundError: print('文件未找到,请输入正确的文件名称!') print('返回') sys.exit()
在上方代码中,要注意以下几点:
声明编码为“gbk”。
导入sys模块,通过sys.exit()方法结束当前语句下方代码的执行。
通过try/except语句,捕获文件不存在的异常(FileNotFoundError),进行相应处理。
通过标签并设置“color”属性,创建红色文字提示。
通过标签添加返回链接。
如果文件名正确输入,能够打开本地的某个文件,这时我们让CGI脚本将正确的HTML页面代码输出给浏览器。
示例代码:
print(''' 编辑 内容编辑:%s
%s
输入密码: ''' % (filename,filename,text))
在上方代码中,要注意以下3点:
标签包含的表单内容,要通过”save.py”脚本文件进行处理;
从上往下,第一个标签的“type”属性值为“hidden”,是将这个标签隐藏,不在页面中显示;而它的“value”属性值为“%s”,写入的是打开的本地文件的名称。这个标签起到的作用是,将当前打开的文件名称传递给”save.py”脚本文件进行后续保存文件内容的处理。
“type”属性为“password”的标签是一个密码类型的文本框,用于输入密码。
4、创建“save.py”文件
保存文件的处理比较简单,主要是一些验证的处理。
首先,验证文件名称、编辑内容和密码是否都正常被获取。
示例代码:
import cgi, sys, hashlibform = cgi.FieldStorage()filename = form.getvalue('filename')password = form.getvalue('password')content = form.getvalue('content')if not (filename and password and content): # 如果有任何一项内容为空值 print('无效的输入!') print('返回') sys.exit()
然后,还要验证输入的密码和预留密码是否一致。
示例代码:
pwd = hashlib.md5() # 创建md5加密对象pwd.update(password.encode()) # 添加加密内容if pwd.hexdigest() != 'e10adc3949ba59abbe56e057f20f883e': # 将加密后的md5码与预置md5码对比 print('无效的密码!') print('返回') sys.exit()
最后,如果以上验证都没有问题,保存文件,给出保存成功的提示。
示例代码:
with open(filename, 'w') as file: file.write(content)print('文档已保存!')print('返回')
到这里,我们就完成了整个练习项目。
领取专属 10元无门槛券
私享最新 技术干货