前驱知识

简单点说:

web服务器接受请求,启动CGI;CGI接受请求,处理,返回给服务器;服务器返回给用户

cgi效率不高,每次都要fork一个新进程出来

WCGI,Python架设的一个桥,连接了服务器和web框架,相当将cgi的连接功能独立了出来,并把处理功能留给了web框架

简介

CGI脚本由HTTP服务器启动,通常用来处理用户通过提交的数据。

通常,CGI脚本位于服务器的专门的cgi-bin目录下。HTTP服务器在脚本的shell环境中放置了请求相关的信息,比如客户端的hostname,请求的url,请求的字符串以及其他东西。服务器执行脚本,并把输出返回给客户端。

脚本的输入也和客户端相连,有时表单数据是通过这种方式读取的。其他时候,表单数据是通过URL的query字符串传递的。这个模块用于处理不同的情况,提供一个简单的接口。同时提供了一些功能,帮助调试脚本。最近添加的功能是通过表单上传文件。

CGI脚本的输出由两部分组成,由一个空行分割。第一部分包含一些头部,告诉客户接下来返回的是什么数据。大概是这样:

print("Content-Type: text/html") # 接下来返回的是html

print() # 空白行,头部结束

第二部分,一般来说是HTML。客户端软件可以展示这些页面,图片什么的。

使用cgi模块

当你写一个新的脚本时,添加下面这两行:

import cgitb

cigtb.enable()

这将会激活一个异常处理器,如果发生了错误,它就会把错误返回给浏览器。如果你不想让用户看到,也可以指定输出目录。

import cgitb

cgitb.enable(display=0, logdir='/path/to/logdir')

补充:

POST请求提交数据有两种方式application/x-www-form-urlencoded和multipart/form-data。前者形如MyVariableOne=ValueOne&MyVariableTwo=ValueTwo,使用%HH的形式编码非ascii码,不接受重复键值。后者接受重复键值、二进制文件等。参考资料

可以通过FieldStorage类获取提交的表单数据,如果含有非asciii码,使用encoding参数,由于它会消耗标准数据,所以应该只被实例化1次。

FieldStorage实例与python的字典相似。可以使用in检测内容,keys, len接口也都可以使用。FieldStorage的每个值也是一个FieldStorage或者MiniFieldStorage实例。

由于表单可能存在重复的项目名,你可以使用getlist()方法。getlist(key_name)方法会返回所有key为key_name的值。

如果上传的表单中存在文件,你可以调用值的read()函数或者readline()函数。

如果是通过application/x-www-form-urlencoded发送的数据,则没有list, file, filename接口。

高级接口

前面介绍了,如果使用FieldStorage类从数据读取CGI。这一节,讲述以西而更可读和符合直觉的高级接口。但,前面讲的技术还是有用的,比如高效处理文件上传。

该接口包含两个方法。使用这戏方法你可以以更一般的方式处理数据,不用担心是否有几个值公用一个名字。

form = cgi.FieldStorage()

item = form.getvalue("item")

if isinstance(item, list):

# handle the list

pass

else:

# handle the single value

pass

进行类型检查是必须的,因为会有好事的用户,输入重复的键名。

你可以使用高级接口提供的getfirst()和getlist()方法。

函数

大部分函数,如cgi.parse,cgi.parse_qs,cgi.parse_qsl,已经被移植到urllib.parse。 cgi.escape被移植到html.escape。

安全问题

原则:如果你启动了一个外部程序函数,永远不要把用户的输入直接传入shell。即使要传入也要确保只含有字母和数字、横杠、下划线和点。

在Unix系统上安装CGI脚本

阅读你的HTTP服务器的文档,找到你的CGI脚本的安装位置,一般是在服务器目录的cgi-bin目录下。

确保你的脚本可被其他程序读和执行;在Unix文件模式下处于0o755:使用chmod 0755 filename。确保第一行有shebang:

#! /usr/local/bin/python

同时,你的脚本需要执行的文件都有对应的权限。因为你的服务器被用户nobody执行,它只能读/写/执行那些被所有人读/写/执行的文件。当前目录和系统环境变量也可能可你目前所处的不一样。

如果你需要从别的目录引用模块,使用sys.path.insert(0, "/path/to/your/module")这样你的模块会被首先搜索。

测试你的CGI脚本

不行的是,当你从命令行尝试CGI脚本是,它很有可能不会运行,而一个能运行的CGI脚本往往在服务器中不能运行。但你仍然应该从命令行中运行脚本,检查一下他是否有语法错误。如果你的脚本没有语法错误,但是它不工作,你只能读下一节。

调试CGI脚本

首先,检查一下琐碎的安装错误,读一下上面关于安装的部分,能节约时间。如果你想知道你是否正确理解了安装过程,把这个模块文件cgi.py安装到你的cgi脚本目录下,启动这个脚本,他就会将它的环境和内容以HTML的格式输出。给他一个合适的模式,发送给他一个请求。如果它被安装在cgi-bin目录下,在你的浏览器内输入如下url:

如果返回404错误,则说明服务器没有找到这个脚本,或许你应该把它装在别的目录下。如果给了别的错误,说明你有安装问题。你应该首先解决这些安装问题,再做别的调试。如果它给出了非常整洁的环境变量和表单内容输出,说明cgi.py被正确的安装了。如果,你的脚本按上述过程安装,你现在可以对他进行调试了。

下一步是在你的脚本中调用cgi模块的test()方法,把它的主要代码替换成cgi.test。

它应该输出和仅安装cgi.py时一致。

当一个普通的python脚本抛出了一个未处理的异常时,Python解释器会把traceback打印出来,退出。当你的CGI脚本抛出异常时,Python解释器也会这么做。这些traceback一般会在你的HTTP服务器的日志文件里,或者被丢弃了。

幸运的是,如果你的脚本执行了某些代码,你可以通过启用cgitb模块,把traceback的内容发送到浏览器中。把下面两行代码加到你脚本的顶部。

import cgitb

cgitb.enable()

如果你怀疑cgitb模块有问题,你可以使用一个更鲁棒的方法,只调用内置模块:

import sys

sys.stderr = sys.stdout

print("Content-Type: text/plain")

print()

上述代码依赖python解释器输出traceback,输出的内容的格式被指定为纯文本,去除了HTML过程。如果你的脚本正常工作,你的客户端会显示纯HTML。如果抛出了异常,前两行打印出之后,traceback会被打印出来,如果没有HTML解释器进行处理,所以traceback会可读。

常见问题及解决

大多数HTTP服务器将CGI脚本的输出放入缓冲区直至脚本完成,这意味着在脚本还在执行时,不可能在客户端展示进度

按上述核对安装过程

监控日志文件

先检查语法错误

如果没有语法错误,在脚本顶部添加import cgitb; cgitb.enable()

当启动外部程序时,确保他们能够被找到,通常这意味着绝对路径名,在CGI脚本中,PATH总是被设置为一个没啥用的值

当脚本读写外部文件是,确保执行CGI的userid能够读写这些文件:一般来说是运行服务器的的userid,或者是服务器的suexec的userid

不要给一个CGI set-uid权限,这在大多数操作系统上不可行,而且不安全。

cgi python_通读Python官方文档之cgi相关推荐

  1. 来了!Python官方文档中文版

    (给Python开发者加星标,提升Python技能) 原创:Python开发者(id:PythonCoder) 2018 年 6 月,Python 3.7.0 发布,并且官方文档语种新增日韩法版本,但 ...

  2. python文档整理,Python官方文档内置函数整理Word版

    <Python官方文档内置函数整理Word版>由会员分享,可在线阅读,更多相关<Python官方文档内置函数整理Word版(6页珍藏版)>请在人人文库网上搜索. 1.传播优秀W ...

  3. 每天一小时python官方文档学习(七)————模块与包

    6. 模块 模块是一个包含Python定义和语句的文件,实际上就是一个正常的.py文件.但是作用和普通需要运行的程序不一样,它实际上有点像函数.如果说函数实现了代码的重用,模块则是实现了函数的重用.我 ...

  4. 每天一小时python官方文档学习(四)————数据结构之列表

    终于进入到第五章数据结构部分了,python中常用的容器有列表.元组.集合和字典,今天主要了解的是最为常用的列表. 5. 数据结构 5.1. 列表的更多特性 对于列表的操作有很多,具体操作看官方文档就 ...

  5. 每天一小时python官方文档学习(一)————python的简单介绍

    我们都知道,python的官方文档写得十分详尽,也是每一个学习python的人都绕不开的. 所以从今天开始,我每天都会用一小时学习python的官方文档,按照文档目录的顺序,摘录一些有用的语句,写下一 ...

  6. [Python3]Python官方文档-Python Manuals

    简介 一般情况下,初学者都不愿意直接去浏览Python Manuals,即Python自带的官方文档.尤其是只有英文版的情况下,初学者更加不会去使用该官方文档了. 在这里笔者强力推荐初学者经常学会使用 ...

  7. opencv python 官方文档里的“sa”关键字是什么意思?(see also)

    在阅读opencv官方文档的时候,有时候会遇见"sa"这个关键字,这是什么意思呢? command sa starts "See also" paragraph ...

  8. python官方文档中文下载-python中文官方文档 PDF 下载

    Python 2 教程 Python是一门简单易学,功能强大的编程语言.它具有高效的高级数据结构和简单而有效的 面向对象编程方法.Python优雅的语法和动态类型以及其解释性的性质,使它在许多领域和 ...

  9. python3.7基础教程_关于本教程 |《Python 官方文档:入门教程 3.7.0》| Python 技术论坛...

    本文档最新版为 3.8,旧版本可能放弃维护,推荐阅读最新版! Python 入门教程 Python 是一门简单易学且功能强大的编程语言.它拥有高效的高级数据结构,并能够用简单又有效的方式进行面向对象编 ...

最新文章

  1. 题目1460:Oil Deposit
  2. Visual C++ 2008入门经典 第九章类的继承和虚函数
  3. Linux中Cache内存占用过高解决办法
  4. sysV init服务脚本(入门级)
  5. Android路由设置
  6. 求两个有序单链表的并交集
  7. java股票公式源码_各种涨停公式源码
  8. “大数据杀熟”手段变种需要警惕!
  9. php中法兰克福的时区,法兰克福时差与中国差多少
  10. 麦凯隆全屋分质供水 保障家庭饮用水安全与健康
  11. 绵阳现在买房怕房价跌,不买又怕房价涨!到底是跌是涨?
  12. 计算机强制关机后无法正常启动,​window7强制关机之后无法正常启动修复方法...
  13. Python实现图像的全景拼接,这不比ps牛逼
  14. 软件开发管理规范(制度)
  15. Chrome的版本和Selenium支持的版本不一致
  16. Spring boot基于itext实现定制化模板pdf生成功能
  17. Photoshop 系列:色阶-曲线-色相和饱和度
  18. 大气精美PHP虚拟资源网站源码
  19. 量能决定趋势 通达信趋势起妖副图 趋势量能选股指标源码
  20. 编辑-发布-开发分离: 静态API设计

热门文章

  1. 【转】一个基于Ajax的通用(组合)查询(ASP.NET)
  2. visual fortran常用数值算法集_资深游戏数值策划自白:数值不是你想象的那么简单!...
  3. 智能判断图片中是否存在某物体_如果给猫披上象皮,神经网络将作何判断?
  4. Android之汽车音频
  5. 解决Python中文注释报错
  6. eclipse 设置虚拟机内存(可用)
  7. 单链表的逆置-C++实现(ok)
  8. tensorflow之add_n
  9. 深度学习自学(十):人脸检测android端-JNI调试调用底层检测识别库
  10. 笔记:vue项目中引用百度地图,地图空白现象