搭建简单的CGI应用程序
原文来源于《核心编程3》第10章web编程
一、静态文件+脚本文件
1.首先开启cgiweb服务器
python2 -m CGIHTTPServer 8000
看到如下反应
2.服务器目录新建cgi-bin目录,html文件放入服务器目录,python cgi脚本放入刚刚建好的cgi-bin目录
3.看下html代码和python cgi脚本代码都是些什么内容
friends.htm

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

1 #!/usr/bin/env python 2 3 import cgi 4 5 reshtml = '''Content-Type: text/html\n 6 <HTML><HEAD><TITLE> 7 Friends CGI Demo (dynamic screen) 8 </TITLE></HEAD> 9 <BODY><H3>Friends list for: <I>%s</I></H3> 10 Your name is: <B>%s</B><P> 11 You have <B>%s</B> friends. 12 </BODY></HTML>''' 13 14 form = cgi.FieldStorage() 15 who = form['person'].value 16 howmany = form['howmany'].value 17 print reshtml % (who, who, howmany)
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()
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()
2.用法和B一样,代码结构也差不多,看下使用效果
浏览器输入地址后
提交用户名,但是不提交数量
点back返回,选数量
点击here,里面是个引用
会回到提交表单的地方,保存了"历史记录"
至此一个简单的cgi应用程序完成了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!