cgi.py

使用python编写cgi程序时,需要使用该模块;它还提供了一些调试脚本,以及处理文件上传请求的工具。

1 介绍

cgi脚本由http server(Apache httpd,nginx)调用,通常处理一些用户提交的信息。

CGI脚本的输出应该包括两部分,这两部分由空行分开。

第一部分说明返回内容的形式:

print "Content-Type: text/html"     # HTML is following
print                               # blank line, end of headers

第二部分是返回的内容,一般为html;

print "<TITLE>CGI script output</TITLE>"
print "<H1>This is my first CGI script</H1>"
print "Hello, world!"

2 使用

2.1

模块引用

import cgi
import cgitb
cgitb.enable()

cgitb 会开启异常处理机制,可以在浏览器中看到错误的详细信息。如果不想在页面显示,也可以通过以下形式将其保存在指定文件中:

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

在开发cgi脚本时特别有用。可以在脚本测试完成后,再删除cgitb配置行。

2.2 表单数据

处理表单数据时,最好使用 FieldStorage 类。

form = cgi.FieldStorage()
if "name" not in form or "addr" not in form:print "<H1>Error</H1>"print "Please fill in the name and addr fields."return
print "<p>name:", form["name"].value
print "<p>addr:", form["addr"].value
...further form processing here...

值为空的表单字段会被过滤掉,因此使用时需要判断是否存某字段,也可以使用FieldStorage(keep_blank_values=true)来保留这些空值的字段。

  1. 字段值可以通过value属性获得;
  2. 也可以通过getvalue()方法获得,getvalue()方法运行设置defalut value。

当提交的表单中,一个字段name对应多个value时, getvalue()将返回一个list。如果使用 form.getlist(),那么将始终返回一个list。

value = form.getlist("username")
usernames = ",".join(value)

表单:

<input type="checkbox" name="item" value="1" />
<input type="checkbox" name="item" value="2" />

cgi脚本可以这样写:

item = form.getvalue("item")
if isinstance(item, list):# The user is requesting more than one item.
else:# The user is requesting only one item.

如果以简单的形式处理:

user = form.getvalue("user").upper()

这种情况下,请求数据的格式一定不能出错,如果有的client在url的query字符串中也添加了一个 item=foo。那么cgi脚本就崩溃了,因为getvalue会返回一个列表。

这种通过判断的形式写的cgi脚本,逻辑判断太多,可读性不好。一个更方便的方法是使用 getfirst() 和 getlist()。

FieldStorage.getfirst(name [, defalut])

该方法只返回第一个值,当然第一值是否与期望值是否匹配,因浏览器而异。如果字段值为空时,也可以给定一个默认值。

FieldStorage.getlist(name)

该方法始终返回一个list,当值为空时,则返回空list。

import cgi
form = cgi.FieldStorage()
user = form.getfirst("user", "").upper()    # This way it's safe.
for item in form.getlist("item"):do_something(item)

这样的代码会显得更加优雅紧凑。

2.3 上传文件处理

如果字段为上传的文件名,那么通过value或者getvalue()访问该时将会以字符串的形式读取内存中的文件。一般情况下,应该先做判断,然后再读取。

fileitem = form["userfile"]
if fileitem.file:# It's an uploaded file; count lineslinecount = 0while 1:line = fileitem.file.readline()if not line: breaklinecount = linecount + 1

通过Post提交的表单,同时又存在 query 字符串的形式,那么将同时包含 FieldStorage 和 MiniFieldStorage。

3 函数

cgi.parse()
cgi.parse_header()
cgi.test()
cgi.print_environ()
cgi.print_form()
cgi.print_directory()
cgi.print_environ_usage()
cgi.escape()

4 其他

  1. 对于任何需要cgi脚本读、写的文件,应该有足够的读(0644)写(0666)权限,出于安全考虑,HTTP server以 ‘nobody’用户执行脚本,没有任何特殊权限。

  2. 当需要加载自定义的 python 模块时,可以先在脚本中更改模块搜索路径。

import sys
sys.path.insert(0, "/usr/home/joe/lib/python")
sys.path.insert(0, "/usr/local/lib/python")
  1. 如果脚本有语法错误,Pyhotn解析器就不会去执行,HTTP Server将会发送未知错误到client。
#> python cgi-script.py 

通过以上方式可以检测是否有语法错误。

python 编写 cgi 脚本相关推荐

  1. 在IIS中写Python的CGI脚本

    原文:怎样在IIS中写Python的CGI脚本 1.安装好Python: 2.配置IIS:         a.打开管理工具-〉Internet信息服务:         b.在网站属性上右键,进入属 ...

  2. 利用python编写手机脚本

    利用python编写手机脚本 adb连接安卓模拟器 在手机里编写python脚本控制手机 如何使用python控制手机(以微信游戏跳一跳为例) adb连接安卓模拟器 链接(转载)https://www ...

  3. 用python写shell脚本_应用python编写shell脚本

    今天同事叫我编写一个shell脚本.话说,虽然我受*nix的影响甚深,但是对于*nix里随处可见的sh脚本却是讨厌之极.为什么讨厌呢?首先是因为sh脚本那莫名其妙的语法,感觉就像随写随扔的程序,完全没 ...

  4. python编写shell脚本详细讲解_python编写shell脚本详细讲解

    今天同事叫我编写一个shell脚本.话说,虽然我受*nix的影响甚深,但是对于*nix 里随处可见的sh脚本却是讨厌之极.为什么讨厌呢?首先是因为sh脚本那莫名其妙的语法,感觉就像随写随扔的程序,完全 ...

  5. python编写安装脚本_2. 编写安装脚本

    2.编写安装脚本¶ The setup script is the centre of all activity in building, distributing, and installing m ...

  6. python编写简单脚本

    1.编写示例脚本,命名为 print.py,打印:10,9,8,7--1 注意在脚本文件中指定本地 python 程序的安装路径 #!/usr/local/bin/python3 #!/usr/loc ...

  7. python编写自动化脚本 与shell_脚本安装Discuz论坛(shell + Python 实现自动化安装)...

    实验环境 1.shell 脚本:linux centos 7 系统 2.Python shell 脚本:window 系统 3.其他:python selenium 模块,谷歌浏览器, 谷歌浏览器驱动 ...

  8. python编写arcgis脚本教程_ArcGIS二次开发(1)arcpy简介及编写一个自己的脚本

    1.1.前言 在数据处理过程中,一般需要做一些数据的整理,如图层合并.裁剪等工作.虽然在ArcMap中也有提供对应的工具(批量处理.建模等),但对于多个步骤之前的衔接及其它特殊处理存在困难,本系列文章 ...

  9. python编写自动化脚本工具_blog/技巧与工具04-python控制鼠标自动化点击脚本.md at master · tigeroses/blog · GitHub...

    title date tags category 技巧与工具04-python控制鼠标自动化点击脚本 2017-06-24 10:04:28 -0700 python pyautogui tools ...

  10. python编写arcgis脚本教程_面向ArcGIS的Python脚本编程

    前言 1 鸣谢 3 第一部分 Python和地理处理的相关概念 4 第1章 Python简介 4 1.1 引言 4 1.2 Python的特点 4 1.3 脚本语言和程序语言 4 1.4 ArcGIS ...

最新文章

  1. SAP SD基础知识之信用风险管理概述
  2. 聚类(三)FUZZY C-MEANS 模糊c-均值聚类算法——本质和逻辑回归类似啊
  3. c语言 3个人比饭量大小,OpenJudge计算概论-比饭量【枚举法、信息数字化】
  4. 自然语言处理python进阶(一)
  5. Linux安装Jenkins
  6. Ehcache配置文件加载方式
  7. AOP的底层实现-CGLIB动态代理和JDK动态代理
  8. 易语言word模板复制粘贴_请给你的Word“打底妆”(让Word跑快些系列)
  9. rabbitmq python 发送失败_python rabbitmq no_ack=false
  10. JavaWeb如何学?
  11. 形式化方法(一) 逻辑部分概念梳理
  12. 老男孩Python 第7期 老男孩Python培训视频教程
  13. QT Designer中编辑菜单栏技巧
  14. 3.5.1_2 Maven - pom.xml 添加maven-assembly-plugin(官方标准打包插件)
  15. MIPAV - Talairach ACPC transform
  16. java中讲讲PrintWriter的用法,举例?
  17. 敏捷开发:一文了解影响地图和用户故事地图之间的那些事儿
  18. 【算法】求解幂集问题
  19. Python自动打码,DdddOcr通用验证码自动识别库
  20. 外网如何访问本地项目

热门文章

  1. 第三章 处理机调度与死锁(汤小丹版操作系统笔记) 超全超详细!!!
  2. 如何将自己的网站发布在互联网上?(仅针对小白,大佬忽略)
  3. 云原生时代的镜像分发工具——Dragonfly简介
  4. nandflash地址的物理地址,逻辑地址,spare地址等理解
  5. Unity创建游戏物体的三种方法
  6. 中国神话中的诸神辈分如何排
  7. 基于设备树的TQ2440触摸屏驱动移植
  8. 使用Audacity软件分析浊音、清音、爆破音的时域及频域特性。
  9. Power BI中字体使用微软雅黑
  10. 我的电脑图标没了怎么办?3个方法找回消失的图标