第25章 项目6:使用CGI进行远程编辑
初次实现
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进行远程编辑的更多相关文章
- 第25章 串行FLASH文件系统FatFs—零死角玩转STM32-F429系列
第25章 串行FLASH文件系统FatFs 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.c ...
- JavaScript高级程序设计(第三版)学习笔记22、24、25章
第22章,高级技巧 高级函数 安全的类型检测 typeof会出现无法预知的行为 instanceof在多个全局作用域中并不能正确工作 调用Object原生的toString方法,会返回[Object ...
- 【C#4.0图解教程】笔记(第19章~第25章)
第19章 泛型 1.泛型概念 泛型提供了一种更准确地使用有一种以上的类型的代码的方式. 泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化. 泛型不是类型,而是类型的模板. 2.声明 ...
- Gradle 1.12用户指南翻译——第四十一章. 项目报告插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 【RL-TCPnet网络教程】第25章 DHCP动态主机配置协议基础知识
第25章 DHCP动态主机配置协议基础知识 本章节为大家讲解DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),通过前面章节对TCP和UDP ...
- 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 ...
- 【STM32H7教程】第25章 STM32H7的TCM,SRAM等五块内存基础知识
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第25章 STM32H7的TCM,SRAM等五块内 ...
- 第25章 Pytorch 如何高效使用GPU
第25章 Pytorch 如何高效使用GPU 深度学习涉及很多向量或多矩阵运算,如矩阵相乘.矩阵相加.矩阵-向量乘法等.深层模型的算法,如BP,Auto-Encoder,CNN等,都可以写成矩阵运算的 ...
- 【PMP学习笔记】第4章 项目整合管理
[PMP学习笔记]第4章 项目整合管理 一.项目整合管理 什么是项目整合管理? 项目整合管理由项目经理负责.虽然其他知识领域可以由相关专家(如成本分析专家.进度规划专家.风险管理专家)管理,但是项目整 ...
随机推荐
- C# PageLayoutControl的基本操作
来自:http://www.cnblogs.com/shenchao/p/3594394.html using System; using System.Collections.Generic; us ...
- python 基础——私有属性
私有属性 python 私有属性以两个下划线开头. python 私有属性只能在类内部访问,类外面访问会出错. python 私有属性之所以不能在外面直接通过名称来访问,其实质是因为 python 做 ...
- 转: 数字证书原理 https 完整过程解析
点评: 讲的非常的详细与全面,值得一看. 转: http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html 文中首先解释了加密解 ...
- Java作业 输入圆的半径计算输出圆的周长和面积
package text1; import java.util.Scanner; public class text11 { public static void main(String[] args ...
- 锋利的jQuery第2版学习笔记8~11章
第8章,用jQuery打造个性网站 网站结构 文件结构 images文件夹用于存放将要用到的图片 styles文件夹用于存放CSS样式表,个人更倾向于使用CSS文件夹 scripts文件夹用于存放jQ ...
- sql server创建表相关
1,设置主键的sql的三种方式 a.字段名 int primary key b.字段名 int constraint 主键名 primary key clustered(字段名) c.创建表是,后置一 ...
- C语言清除输入缓存方法记录[转]
原文:http://www.tomytime.com/archives/218/ fflush()函数是标准的作法. setbuf(stdin,NULL)是GCC下可用的一种方法. scanf(&qu ...
- Java获取操作系统信息
今天在看jdk的demo时候发现java获取系统操作系统的一些信息,例如内存使用情况,于是自己也想研究研究! 百度一番,发现有2种方法! 1.sun自带的API 2.第三方jar(Sigar) 先 ...
- poj 3669 Meteor Shower
Me ...
- iOS开发笔记-两种单例模式的写法
iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...