原文来源于《核心编程3》第10章web编程

一、静态文件+脚本文件

1.首先开启cgiweb服务器

python2 -m CGIHTTPServer 8000

看到如下反应

2.服务器目录新建cgi-bin目录,html文件放入服务器目录,python cgi脚本放入刚刚建好的cgi-bin目录

3.看下html代码和python cgi脚本代码都是些什么内容

friends.htm

 <HTML><HEAD><TITLE>
Friends CGI Demo (static screen)
</TITLE></HEAD>
<BODY><H3>Friends list for: <I>NEW USER</I></H3>
<FORM ACTION="/cgi-bin/friendsA.py">
<B>Enter your Name:</B>
<INPUT TYPE=text NAME=person VALUE="NEW USER" SIZE=15>
<P><B>How many friends do you have?</B>
<INPUT TYPE=radio NAME=howmany VALUE="0" CHECKED> 0
<INPUT TYPE=radio NAME=howmany VALUE="10"> 10
<INPUT TYPE=radio NAME=howmany VALUE="25"> 25
<INPUT TYPE=radio NAME=howmany VALUE="50"> 50
<INPUT TYPE=radio NAME=howmany VALUE="100"> 100
<P><INPUT TYPE=submit></FORM></BODY></HTML>

friends.htm

friendsA.py

 #!/usr/bin/env python

 import cgi

 reshtml = '''Content-Type: text/html\n
<HTML><HEAD><TITLE>
Friends CGI Demo (dynamic screen)
</TITLE></HEAD>
<BODY><H3>Friends list for: <I>%s</I></H3>
Your name is: <B>%s</B><P>
You have <B>%s</B> friends.
</BODY></HTML>''' form = cgi.FieldStorage()
who = form['person'].value
howmany = form['howmany'].value
print reshtml % (who, who, howmany)

friendsA.py

4.运行起来看看,浏览器输入

http://localhost:8000/friends.htm

结果可以看到

我们随意添加一个,点提交

可以看到正文部分变化了,同时地址内容也变化了,

再看下终端,也在有相应的显示。

二、单个脚本文件

  1.服务器照常开启,脚本文件friendsB.py放在cgi-bin目录下

  2.代码内容

#coding=utf-8
import cgi header = 'Content-Type: text/html\n\n' #需要先返回一个适当的http头文件,再返回结果页面 formhtml = '''<HTML><HEAD><TITLE>
Friends CGI Demo</TITLE></HEAD>
<BODY><H3>Friends list for: <I>NEW USER</I></H3>
<FORM ACTION="/cgi-bin/friendsB.py">
<B>Enter your Name:</B>
<INPUT TYPE=hidden NAME=action VALUE=edit>
<INPUT TYPE=text NAME=person VALUE="NEW USER" SIZE=15>
<P><B>How many friends do you have?</B>
%s
<P><INPUT TYPE=submit></FORM></BODY></HTML>''' fradio = '<INPUT TYPE=radio NAME=howmany VALUE="%s" %s> %s\n' def showForm():
friends = []
for i in (0, 10, 25, 50, 100):
checked = ''
if i == 0:
checked = 'CHECKED'
friends.append(fradio % (str(i), checked, str(i))) #灵活输出,避免太多重复 print '%s%s' % (header, formhtml % ''.join(friends)) #表单页面http头文件和内容都加进去了 reshtml = '''<HTML><HEAD><TITLE>
Friends CGI Demo</TITLE></HEAD>
<BODY><H3>Friends list for: <I>%s</I></H3>
Your name is: <B>%s</B><P>
You have <B>%s</B> friends.
</BODY></HTML>''' def doResults(who, howmany):
print header + reshtml % (who, who, howmany) #结果页面也都加进去了 def process():
form = cgi.FieldStorage()
if 'person' in form:
who = form['person'].value
else:
who = 'NEW USER' if 'howmany' in form:
howmany = form['howmany'].value
else:
howmany = 0 if 'action' in form: #action变量用来判断选择哪个页面,表单页面、结果页面
doResults(who, howmany)
else:
showForm() if __name__ == '__main__':
process()

friendsB.py

  3.浏览器输入

http://localhost:8000/cgi-bin/friendsB.py

会看到一样的界面,提交后也是一样的

三、单个脚本文件,带有用户交互和错误处理

  1.代码

#coding=utf-8
#!/usr/bin/env python
import cgi
from urllib import quote_plus header = 'Content-Type: text/html\n\n'
url = '/cgi-bin/friendsC.py' errhtml = '''<HTML><HEAD><TITLE>
Friends CGI Demo</TITLE></HEAD>
<BODY><H3>ERROR</H3>
<B>%s</B><P>
<FORM><INPUT TYPE=button VALUE=Back
ONCLICK="window.history.back()"></FORM>
</BODY></HTML>''' #后退按钮 def showError(error_str): #错误处理部分
print header + errhtml % error_str formhtml = '''<HTML><HEAD><TITLE>
Friends CGI Demo</TITLE></HEAD>
<BODY><H3>Friends list for: <I>%s</I></H3>
<FORM ACTION="%s">
<B>Enter your Name:</B>
<INPUT TYPE=hidden NAME=action VALUE=edit>
<INPUT TYPE=text NAME=person VALUE="%s" SIZE=15>
<P><B>How many friends do you have?</B>
%s
<P><INPUT TYPE=submit></FORM></BODY></HTML>''' fradio = '<INPUT TYPE=radio NAME=howmany VALUE="%s" %s> %s\n' def showForm(who, howmany):
friends = []
for i in (0, 10, 25, 50, 100):
checked = ''
if str(i) == howmany: #多传一个参数,用来记录'历史数据'
checked = 'CHECKED'
friends.append(fradio % (str(i), checked, str(i)))
print '%s%s' % (header, formhtml % (
who, url, who, ''.join(friends))) reshtml = '''<HTML><HEAD><TITLE>
Friends CGI Demo</TITLE></HEAD>
<BODY><H3>Friends list for: <I>%s</I></H3>
Your name is: <B>%s</B><P>
You have <B>%s</B> friends.
<P>Click <A HREF="%s">here</A> to edit your data again.
</BODY></HTML>''' def doResults(who, howmany):
newurl = url + '?action=reedit&person=%s&howmany=%s' % (
quote_plus(who), howmany) #表单记录包含 print header + reshtml % (who, who, howmany, newurl) #再次编辑回到表单界面 def process():
error = ''
form = cgi.FieldStorage() if 'person' in form:
who = form['person'].value.title()
else:
who = 'NEW USER' if 'howmany' in form: #根据howmany字段判定有没有选择人数,没有就算有错误,返回错误页面
howmany = form['howmany'].value
else:
if 'action' in form and \
form['action'].value == 'edit':
error = 'Please select number of friends.'
else:
howmany = 0 if not error:
if 'action' in form and \
form['action'].value != 'reedit':
doResults(who, howmany)
else:
showForm(who, howmany)
else:
showError(error) if __name__ == '__main__':
process()

friendsC

  2.用法和B一样,代码结构也差不多,看下使用效果

浏览器输入地址后

提交用户名,但是不提交数量

点back返回,选数量

点击here,里面是个引用

会回到提交表单的地方,保存了"历史记录"

至此一个简单的cgi应用程序完成了。

最新文章

  1. 修改ubuntu DNS的步骤/wget url报错: unable to resolve host address的解决方法
  2. Dom终
  3. java的分层开发
  4. three.js 显示一个绿色的正方体
  5. I2S (Inter—IC Sound) 总线
  6. Django serializers 序列化 rest_framework
  7. 在vs2005中使用AnkhSvn服务端IP改变无法连接
  8. JAVA敏捷开发环境搭建(转载)
  9. 沈逸老师ubuntu速学笔记(2)-- ubuntu16.04下 apache2.4和php7结合编译安装,并安裝PDOmysql扩展
  10. Android应用--新浪微博客户端新特性滚动视图和启动界面实现
  11. caffe+NVIDIA安装+CUDA-7.5+ubuntu14.04(显卡GTX1080)
  12. jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)
  13. Android 扩大 View 的点击区域
  14. c#调用python代码
  15. .Net Core 2.0 preview1实现自定义认证方案
  16. Chrome---谷歌浏览器修改用户缓存文件夹 如何设置缓存路径
  17. 2018,ANG发展峰会惊喜来袭
  18. hdu 2095 find your present (2) 位运算
  19. SSM商城项目(五)
  20. day04--流程控制之if

热门文章

  1. 虚拟机安装ubuntu14.04.5系统
  2. GTY&#39;s gay friends HDU - 5172 线段树
  3. mesos+marathon+zookeeper+docker
  4. Python/spss-多元回归建模-共线性诊断2(推荐AA)
  5. 前端PHP入门-005-爱情是常量还是变量
  6. OpenCV---膨胀与腐蚀
  7. Packet Tracer 5.0 构建CCNA实验(3)—— 路由器实现vlan间通信
  8. How To Build Compelling Stories From Your Data Sets
  9. Bzoj2300 / 洛谷P2521 [HAOI2011]防线修建
  10. UTF8字符串转换为汉字 c#