Python3练习项目12:在线编辑文件(下)

这一篇教程,我们来完成在线文件编辑这个练习项目的第二阶段。

我们在上一篇教程中,已经了解了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('返回')

到这里,我们就完成了整个练习项目。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180414G09EVH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券