初次实现

25-1 simple_edit.cgi ——简单的网页编辑器

#!D:\Program Files\python27\python.exe
import cgi
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.dat文件(没有该文件则无法运行)放在D:\Program Files\Apache24\cgi-bin目录下

在浏览器中输入:http://localhost/cgi-bin/simple_edit.cgi

输出如下:

按照书上输入Nickety, nockety, noo, noo, noo...并提交

从页面看没什么变化,但simple_edit.dat中写入了以上内容

再次打开http://localhost/cgi-bin/simple_edit.cgi,页面显示如下:

且每次在查询内容中输入不同的字符,都会重新写入simple_edit.dat。

再次实现

将CGI脚本拆分为3个:一个带有能输入文件名的表单的网页index.html,在文本域中显示给定文件的脚本edit.cgi,保存收到的文本到给定文件的脚本save.cgi。

index.html:HTML文件,包括用于输入文件名的表单

<html>
<head>
<title>File Editor</title>
</head>
<body>
<form action='edit.cgi' method='POST'>
<b>File name:</b><br />
<input type='text' name='filename' />
<input type='submit' value='Open' />
</body>
</html>

25-2 edit.cgi ——编辑器脚本

edit.cgi显示网页,还有一个用于输入密码的文本框。

abspath函数被用于获取data目录的绝对路径,文件名保存在hidden表单元素中。会被传递到下一个脚本save.cgi中。

#!D:\Program Files\python27\python.exe

print 'Content-type: text/html\n'

from os.path import join, abspath

import cgi, sys

BASE_DIR = abspath('data')

form = cgi.FieldStorage()
filename = form.getvalue('filename')
if not 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)

密码处理——sha模块(SecureHash Algorithm,安全哈希算法)

从输入字符串中提取看似随机数据的根本上无意义字符串的一种方法。

>>> from sha import sha

>>> sha('foobar').hexdigest()

'8843d7f92416211de9ebb963ff4ce28125932878'

>>> sha('foobaz').hexdigest()

'21eb6533733a5e4763acacd1d45a60c2e0e404e1'

密码中的微小改变会输出完全不同的摘要。

25-3 save.cgi ——实现保存功能的脚本

处理前端提交的数据,并保存:接受一个文件名、一个密码和一些文本,并且检查密码是否正确。

#!D:\Program Files\python27\python.exe

print'Content-type: text/html\n'

from os.path import join, abspath
import cgi, sha, sys

BASE_DIR = abspath('data')

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

if not(filename and text and password):
print 'Invalid parameters.'
sys.exit()
if sha.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.'

将index.html及脚本edit.cgi、save.cgi放入到D:\Program Files\Apache24\htdocs目录下,并创建data文件夹,新建空白的edit.dat文件。

在浏览器中输入:localhost或127.0.0.1即可调出 index.html。

输入edit.dat然后点击open:

密码默认为foobar,输入文本Nickety, nockety, noo, noo, noo...,并提交:

文本写入到edit.dat中:

若密码输入错误,显示如下:

若无任何密码或文本输入,显示如下:

第25章 项目6:使用CGI进行远程编辑的更多相关文章

  1. 第25章 串行FLASH文件系统FatFs—零死角玩转STM32-F429系列

    第25章     串行FLASH文件系统FatFs 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.c ...

  2. JavaScript高级程序设计(第三版)学习笔记22、24、25章

    第22章,高级技巧 高级函数 安全的类型检测 typeof会出现无法预知的行为 instanceof在多个全局作用域中并不能正确工作 调用Object原生的toString方法,会返回[Object ...

  3. 【C#4.0图解教程】笔记(第19章~第25章)

    第19章 泛型 1.泛型概念 泛型提供了一种更准确地使用有一种以上的类型的代码的方式. 泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化. 泛型不是类型,而是类型的模板.   2.声明 ...

  4. Gradle 1.12用户指南翻译——第四十一章. 项目报告插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  5. 【RL-TCPnet网络教程】第25章 DHCP动态主机配置协议基础知识

    第25章      DHCP动态主机配置协议基础知识 本章节为大家讲解DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),通过前面章节对TCP和UDP ...

  6. CHAPTER 25 The Greatest Show on Earth 第25章 地球上最壮观的演出

    CHAPTER 25 The Greatest Show on Earth 第25章 地球上最壮观的演出 Go for a walk in the countryside and you will f ...

  7. 【STM32H7教程】第25章 STM32H7的TCM,SRAM等五块内存基础知识

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第25章       STM32H7的TCM,SRAM等五块内 ...

  8. 第25章 Pytorch 如何高效使用GPU

    第25章 Pytorch 如何高效使用GPU 深度学习涉及很多向量或多矩阵运算,如矩阵相乘.矩阵相加.矩阵-向量乘法等.深层模型的算法,如BP,Auto-Encoder,CNN等,都可以写成矩阵运算的 ...

  9. 【PMP学习笔记】第4章 项目整合管理

    [PMP学习笔记]第4章 项目整合管理 一.项目整合管理 什么是项目整合管理? 项目整合管理由项目经理负责.虽然其他知识领域可以由相关专家(如成本分析专家.进度规划专家.风险管理专家)管理,但是项目整 ...

随机推荐

  1. Android(java)学习笔记265:Android线程形态之 HandlerThread

    1.  HandlerThread Android HandlerThread 完全解析 Handler与HandlerThread区别,HandlerThread应用(对比AsyncTask) 备注 ...

  2. Android 自定义Dialog工具类

    由于项目的需要,系统的弹出框已经不能满足我们的需求,我们需要各式各样的弹出框,这时就需要我们去自定义弹出框了. 新建布局文件 dialog_layout.xml,将下面内容复制进去 <?xml ...

  3. 20145102 《Java程序设计》第1周学习总结

    20145102 <Java程序设计>第1周学习总结 教材学习内容总结 linux下对于java的安装是非常简便的,只要参照ArchWiki就可以快速安装,没有Windows上那么复杂.I ...

  4. codeforces 675C C. Money Transfers(贪心)

    题目链接: C. Money Transfers time limit per test 1 second memory limit per test 256 megabytes input stan ...

  5. 如何为不定高度(height:auto)的元素添加CSS3 transition-property:height 动画

    但一个元素不设置height时,它的默认值是 auto,浏览器会计算出实际的高度. 但如果想给一个 height:auto 的块级元素的高度添加 CSS3 动画时,该怎么办呢? 从 MDN 的可以查到 ...

  6. MySql运算符

    算数运算符 加(+).减(-).乘(*).除(/).求余(%) 比较运算符 大于(>).小于(<).等于(=).大于等于(>=).小于等于(<=).不等于(!= 或者 < ...

  7. Windows无法启动SQL server 代理服务(服务器)错误1067:进程意外终止

    解决办法: 将关联的sql server(实例) 服务停止. 然后启动sql server代理 服务. (解决办法是从网络查询所得后,证明此法可用!)

  8. Part 100 Func delegate in c#

    What is Func<T,TResult> in C#? In simple terms,Func<T,TResult> is just generic delegate. ...

  9. CI框架程序--本地调试之后部署新浪SAE

    前几天给朋友写了个简单的网站, 想想还是部署到服务器上让朋友看一下效果! 用CI框架写的,有个SAE新浪云的账号,可以用!就部署到上面去了!途中遇到了一些问题!一一解决了! 在这里分享一下 供遇到这些 ...

  10. Javascript加载速度慢解决办法

    通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢.解决办法:换一个js包含的方式,让javascript加载速度倍 ...