设为首页 收藏本站
查看: 1225|回复: 0

[经验分享] python cgi 编程

[复制链接]

尚未签到

发表于 2015-12-2 11:27:53 | 显示全部楼层 |阅读模式
  python默认自带了几个和web相关的模块。原来只知道SimpleHTTPServer 这个模块,后来又知道了 CGIHTTPServer 这个模块


  • SimpleHTTPServer



  • 1 python -m  SimpleHTTPServer 80
      在命令行里键入上面的命令就有了一个简单的HTTP服务器了,服务器的端口是 80 (也可以是别的,如果80端口被占用了)

  -m 的意思就是 module,web的根目录是命令行的当前目录  (win7 下 在一个文件夹空白的地方 shift+鼠标右键  会出现在此处打开命令行,再输入上面的例子就可以把当前目录作为web的根目录)
  打开浏览器,输入 http://localhost:80 即可看到文件夹下的目录和文件。


  •     在忘记带u盘时,可以简单的做一个文件共享。
  •            多看系统的wifi传书应该也是这个原理。
  •            还可以简单的测试一下网页是否正常
  •            如果文件夹下有index.html 就会自动打开作为首页


  • CGIHTTPServer



  • 1 python -m CGIHTTPServer 80
      命令的解释和上面差不多,这次启动的是CGI (Common Gateway Interface)服务器,CGI 程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。

DSC0000.gif
  用上面的命令启动的 CGI服务器,web的根目录还是命令行的当前目录。但是如果直接把cgi的脚本放在当前目录下面是不能执行的,必须新建一个文件夹叫做cgi-bin,把脚本都放在这个目录下才能执行
  通俗的来说就是通过web去调用一个本地的程序,然后再把结果输出到web,就是这样一个交互的过程。有关python的CGI编程可以参考这个网站:http://www.w3cschool.cc/python/python-cgi.html上面的代码有好多是不能直接运行的,需要修改
  下面给出一个例子:
  起源:亚马逊的商品的图片的大小、旋转都是url query里面的参数控制的  可以看这个网址http://aaugh.com/imageabuse.html
  现在我们要模拟下那个大小的参数
  


DSC0001.gif DSC0002.gif


1 #coding:utf-8
2 import cv,cv2
3 import cgi,cgitb
4
5 form = cgi.FieldStorage()
6 size = form.getvalue('s')
7
8 print "Content-Type:image/jpeg\r\n",
9 print    #必须有  header的格式
10
11 if size in ['big','small']:
12     img = cv2.imread('cgi-bin/1.jpg')
13     if size == 'big':
14         resized = cv2.resize(img,(img.shape[1]*2,img.shape[0]*2))
15     elif size == 'small':
16         resized = cv2.resize(img,(img.shape[1]/2,img.shape[0]/2))        
17     cv2.imwrite("cgi-bin/resized.jpg",resized)
18     f = open('cgi-bin/resized.jpg','rb')
19     print f.read(-1)
20     f.close()
21 else:
22     f = open('cgi-bin/1.jpg','rb')
23     print f.read(-1)
24     f.close()
View Code  访问的url应该是这样的  http://localhost/cgi-bin/img.py?s=small    s是size的一个标志,有big和small两个参数,默认的我们返回原始大小的图像。代码中使用到了opencv来进行resize到两倍或者缩小一倍。当然实际应用中可能更加复杂。
  前面的一段代码是输出http的header,http的header 里面的换行都是\r\n header结束的标志就是有两个连续的\r\n
  总结:
  上面只是python内置的几个简单的webserver,功能肯定比Apache什么的少了不少,但是偶尔测试一下还是可以的,不用装那么大的软件。
  如果要深入学习web的还是要找一些框架,像是 Django、Tornado等。
  
  使用Python开发Web,最简单,原始和直接的办法是使用CGI标准,在1998年这种方式很流行。 现在从应用角度解释它是如何工作: 首先做一个Python脚本,输出HTML代码,然后保存成.cgi扩展名的文件,通过浏览器访问此文件。 就是这样。
尽管实现很简单,还是暴露了一些问题和不便的地方。 问你自己这几个问题:



  • 应用中有多处需要连接数据库会怎样呢? 每个独立的CGI脚本,不应该重复写数据库连接的代码。 比较实用的办法是写一个共享函数,可被多个代码调用。




  • 一个开发人员 确实 需要去关注如何输出Content-Type以及完成所有操作后去关闭数据 库么? 此类问题只会降低开发人员的工作效率,增加犯错误的几率。 那些初始化和释放 相关的工作应该交给一些通用的框架来完成。




  • 如果这样的代码被重用到一个复合的环境中会发生什么? 每个页面都分别对应独立的数据库和密码吗?




  • 如果一个Web设计师,完全没有Python开发经验,但是又需要重新设计页面的话,又将 发生什么呢? 一个字符写错了,可能导致整个应用崩溃。 理想的情况是,页面显示的逻辑与从数据库中读取书本记录分隔开,这样 Web设计师的重新设计不会影响到之前的业务逻辑。


以上正是Web框架致力于解决的问题。 Web框架为应用程序提供了一套程序框架, 这样你可以专注于编写清晰、易维护的代码,而无需从头做起。 简单来说,这就是Django所能做的。
                                                                                -------------------The Django Book 2.0--中文版
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146274-1-1.html 上篇帖子: python3.4学习笔记(二十五) Python 调用mysql redis实例代码 下篇帖子: python 模块发布及使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表