最新消息:欢迎光临 魔力 • Python!大家可以点开导航菜单中的【学习目录】,这个目录类似图书目录,更加方便学习!

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

Python教程 小楼一夜听春语 3815浏览 0评论

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

我们在上一篇教程中,已经了解了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文件。

在创建好的文件中会自带一些代码。

这些代码中有一些需要修改,包括:语言类型、字符集和页面标题。

示例代码:

<!DOCTYPE html>
<html lang="en"> <!"en"需要改为"zh_cn">
<head>
    <meta charset="UTF-8"> <!"UTF-8"需要改为"gbk">
    <title>Title</title> <!"Title"需要改为自定义的页面标题>
</head>
<body>

</body>
</html>

按照上方的注释修改完之后,我们需要添加一些表单标签的代码。

示例代码:

<!DOCTYPE html>
<html lang="zh_cn"> <!修改后的代码>
<head>
    <meta charset="gbk"> <!修改后的代码>
    <title>在线文本编辑</title><!haha> <!修改后的代码>
</head>
<body>
<form action="edit.py" method="post"> <!新增加的代码>
    <b>请输入文件名称:</b><br/>
    <input type="text" name="filename">
    <input type="submit" value="打开">
</form>
</body>
</html>

新增加的代码是一对<form>标签和其中的内容。

在<form>标签中,我们需要指定属性“action”为“edit.py”,也就是说当这个表单提交时,由“edit.py”这个脚本进行处理。而后面一个属性“method”需要指定数据的提交的方式,默认为“post”,也可以使用“get”。

在两个<form>标签之间,有两个<input>标签,一个是文本框,一个是提交按钮。因为要获取文本框中输入的内容,所以文本框标签中要设置“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,sys

form = cgi.FieldStorage()
filename = form.getvalue('filename')
if not filename:
    print('<font color="red">请输入一个文件名称!</font>')
    print('<a href="\index.html" >返回</a>')
    sys.exit()
try:
    text = open(filename).read()
except FileNotFoundError:
    print('<font color="red">文件未找到,请输入正确的文件名称!</font>')
    print('<a href="\index.html" >返回</a>')
    sys.exit()

在上方代码中,要注意以下几点:

  • 声明编码为“gbk”。
  • 导入sys模块,通过sys.exit()方法结束当前语句下方代码的执行。
  • 通过try/except语句,捕获文件不存在的异常(FileNotFoundError),进行相应处理。
  • 通过<font>标签并设置“color”属性,创建红色文字提示。
  • 通过<a>标签添加返回链接。

如果文件名正确输入,能够打开本地的某个文件,这时我们让CGI脚本将正确的HTML页面代码输出给浏览器。

示例代码:

print('''
<!DOCTYPE html>
<html lang="zh_cn">
<head>
    <meta charset="gbk">
    <title>编辑</title>
</head>
<body>
<form action="save.py" method="post">
    <input type="hidden" value="%s" name="filename"/>
    <b>内容编辑:</b>%s<br/>
    <in>
    <textarea rows="20" cols="60" name="content">%s</textarea><br/>
    <b>输入密码:</b>
    <input type="password" name="password"/>
    <input type="submit" value="保存文档">
</form>
</body>
</html>
''' % (filename,filename,text))

在上方代码中,要注意以下3点:

  • <form>标签包含的表单内容,要通过”save.py”脚本文件进行处理;
  • 从上往下,第一个<input>标签的“type”属性值为“hidden”,是将这个标签隐藏,不在页面中显示;而它的“value”属性值为“%s”,写入的是打开的本地文件的名称。这个标签起到的作用是,将当前打开的文件名称传递给”save.py”脚本文件进行后续保存文件内容的处理。
  • “type”属性为“password”的<input>标签是一个密码类型的文本框,用于输入密码。

4、创建“save.py”文件

保存文件的处理比较简单,主要是一些验证的处理。

首先,验证文件名称、编辑内容和密码是否都正常被获取。

示例代码:

import cgi, sys, hashlib

form = cgi.FieldStorage()
filename = form.getvalue('filename')
password = form.getvalue('password')
content = form.getvalue('content')

if not (filename and password and content):  # 如果有任何一项内容为空值
    print('<font color="red">无效的输入!</font>')
    print('<a href="\edit.py" >返回</a>')
    sys.exit()

然后,还要验证输入的密码和预留密码是否一致。

示例代码:

pwd = hashlib.md5()  # 创建md5加密对象
pwd.update(password.encode())  # 添加加密内容
if pwd.hexdigest() != 'e10adc3949ba59abbe56e057f20f883e':  # 将加密后的md5码与预置md5码对比
    print('<font color="red">无效的密码!</font>')
    print('<a href="\edit.py" >返回</a>')
    sys.exit()

最后,如果以上验证都没有问题,保存文件,给出保存成功的提示。

示例代码:

with open(filename, 'w') as file:
    file.write(content)
print('<font color="green">文档已保存!</font>')
print('<a href="\index.html" >返回</a>')

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

本节练习源代码:【点此下载

转载请注明:魔力Python » 练习项目12:在线编辑文件(下)

头像
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网站 (可选)