python CGI 编程实践
文章更新于:2020-03-05
注1:安装 python 参见: python 的安装使用和基本语法
注2:配置 web 环境参见: Windows&linux使用集成环境搭建 web 服务器
注3:linux 配置 CGI参见:linux 配置 python3 CGI
注4:Windows配置 CGI 参见:windows环境下利用python进行CGI配置
一、Web服务器的支持与配置
在进行CGI编程之前,请确保Web服务器支持CGI,它被配置为处理CGI程序。所有对由HTTP服务器执行的CGI程序保存在一个预先配置的目录。此目录被称为CGI目录,并按照惯例被命名为/var/www/cgi-bin目录。按照惯例,CGI文件具有扩展名为.cgi,但文件扩展名可以为Python语言脚本 .py。
//原文出自【易百教程】,非商业请保留原文链接:https://www.yiibai.com/python/python_cgi_programming.html
默认情况下,Linux服务器被配置为只运行在在/var/www/cgi-bin目录中的脚本。如果想在其他目录运行CGI程序,需要更改配置文件。有两种方法。
1、设置 ScriptAlias(方法一)
在/etc/httpd/conf/httpd.conf主配置文件中,找到ScriptAlias所在行,添加你所需要的目录,如:
ScriptAlias /test/ "/var/www/test/"
上述代码的 /test/ 是你web访问的路径, /var/www/test/ 是你web访问路径实际对应的本地路径。
配置完成之后,保存退出,重启 httpd 服务即可。
注1:以上路径配置之后,该目录下所有文件都视为CGI程序处理,如果这时你放一个HTML文件进去,访问的时候会出错。
注2:路径最后的/不能少,少了会报错。
2、配置对应的目录(方法二)
在主配置文件中写入以下内容:
# 下面的目录为你要设定的目录
<Directory "/var/www/test/">
Options ExecCGI
</Directory>
# 找到 AddHandler 所在行,加入你要添加的后缀,这里添加 .py
AddHandler cgi-script .cgi .py
经过这样设定后,在此目录下以 .py 结尾的文件当做 cgi 程序处理,其他文件正常处理。
二、 CGI 程序实践
1、声明程序解释器和编码
CGI 程序需要在程序开头声明程序解释器,程序解释器也就是程序用什么来执行。
以python举例:
Windows声明:#! "D:\program|python37\python.exe",注意,一定要声明到.exe文件。
Linux声明:#! /usr/bin/env python3 ,也可使用 #!/usr/bin/python3
然后第二行声明程序编码:# -*- coding:UTF-8 -*-,注意,程序编码只在前两行范围内声明有效。
2、输出响应头部(HTTP报文头)信息
比如说:
print("Content-type:text/html")
一些重要的HTTP头如下:
| 报头 | 描述 |
|---|---|
| Content-type: | 返回MIME字符串,定义文件的格式。例如Content-type:text/html |
| Expires:Date | 日期的信息变为无效。这应该被使用的浏览器,以决定当一个页面需要刷新。有效日期字符串应该是格式1998年1月1日12:00:00 GMT。 |
| Location: URL | 应该返回替代请求URL的URL。可以使用此字段来重定向请求到任何文件。 |
| Last-modified: Date | 资源的最后修改的日期。 |
| Content-length: N | 数据的长度,以字节为单位被返回。浏览器使用这个值来报告预计下载时间的文件。 |
| Set-Cookie:String | 通过设置该字符串传递cookie |
输出完报文头以后要输出1-2个空行 print("\n"),以告诉服务器报头部分结束,否则会报错。
3、CGI环境变量。
所有的CGI程序都可使用以下环境变量:
| 环境变量 | 描述 |
|---|---|
| CONTENT_TYPE | 内容的数据类型。当客户端发送内容附加到服务器使用。例如,文件上传等。 |
| CONTENT_LENGTH | 查询信息的长度。它仅适用于POST请求。 |
| HTTP_COOKIE | 返回键和值对的形式设置Cookie。 |
| HTTP_USER_AGENT | 用户代理请求头字段包含有关用户代理发起请求信息。网络浏览器的名称。 |
| PATH_INFOTCGI | 脚本的路径。 |
| QUERY_STRING | 被发送GET方法请求URL编码的信息。 |
| REMOTE_ADDR | 远程主机发出请求的IP地址。这可以是用于记录或用于认证的目的是有用的。 |
| REMOTE_HOST | 发出请求的主机的完全合格的名称。如果该信息不可用,则REMOTE_ADDR可用于获得IP地址。 |
| REQUEST_METHOD | 该方法用于制造要求。最常用的方法是GET和POST。 |
| SCRIPT_FILENAMECGI | 脚本的完整路径。 |
| SCRIPT_NAMECGI | 脚本的名称。 |
| SERVER_NAME | 服务器的主机名或IP地址 |
| SERVER_SOFTWARE | 软件服务器运行的名称和版本。 |
程序使用这些变量需要导入os包,程序举例:
#! /usr/bin/env python
# -*- coding:UTF-8 -*-
print('Content-Type: text/html; charset=utf-8\n')
import os
print("你好")
print("<br>你的IP是:%s"%os.environ['REMOTE_ADDR'])
4、GET / POST 方法
GET 方法适用于显式传送信息,内容会出现在 URL 中,有 1024 字符的长度限制。
POST 方法没有大小限制,采用隐式传送,所以比较安全。
举个例子:
GET:访问 /cgi-bin/test.py?key=hello,将会传递值为hello的key给cgi·程序。
POST:访问 /cgi-bin/test.py,并传递值给cgi程序。
二者可以使用同一个脚本进行接收,cgi程序可以使用接收并处理这个值。
#! /usr/bin/env python3
# -*- utf-8 -*-
# 导入处理模块
import cgi, cgitb
# 创建FieldStorage实例
form = cgi.FieldStorage()
# 进行赋值操作
getvalue = form.getvalue('key')
# 输出报文头并换行结束头部
print("Content-type:text/html\n")
# 输出HTML代码
print("<html>")
print("<head>")
print("<title>Get value program!</title>")
print("</head>")
print("<body>")
print("You have put the value: %s"%getvalue)
print("</body>")
print("</html>")
5、在 CGI 程序中使用 cookies
HTTP 是无状态协议,但如果你想让访问者从你网站的一个页面跳转到另一个页面的时候保持登录状态,就可以使用cookies来实现。
cookies 是服务器请求在访问者电脑硬盘上保存的一段简单文本,这段文本标识了访问者的身份。
当访问者从一个页面跳转到另一个页面的时候,浏览器会带上这段文本,服务器检查这段文本来确定访问者的身份。
cookies 是5个可变长的纯文本数据。
| 值 | 描述 |
|---|---|
| Expires | cookie过期的时间,如果置空则表示退出浏览器即过期 |
| Domain | cookie在你网站的哪些域名可以生效 |
| Path | 在你网站的有效的域名上哪些网页路径可以生效,如果置空则表示所有都生效 |
| Secure | 规定是否通过安全的 HTTPS 连接来传输 cookie |
| Name=Value | cookies的键值对信息,也就是cookie的名称和值,可以设置多个 |
举个例子:
print "Set-Cookie:UserID=mingzi;"
print "Set-Cookie:Password=mima123;"
print "Set-Cookie:Expires=Tuesday, 3-Dec-2020 08:30:00 GMT";"
print "Set-Cookie:Domain=www.xxxx.com;"
print "Set-Cookie:Path=/test;"
print "Content-type:text/html"
那么CGI如何获取cookie呢?
#!/usr/bin/python
# -*- utf-8 -*-
print("Content-type:text/html\n")
# Import modules for CGI handling
from os import environ
import cgi, cgitb
if environ.has_key('HTTP_COOKIE'):
for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
(key, value ) = split(cookie, '=');
if key == "UserID":
user_id = value
if key == "Password":
password = value
print "User ID = %s" % user_id
print "Password = %s" % password
三、Enjoy!
python CGI 编程实践的更多相关文章
- Python CGI编程(转自易百)
Python CGI编程 Python的CGI编程,公共网关接口或CGI,Web服务器和一个自定义的脚本之间交换信息是一组定义的标准. 什么是CGI ? 公共网关接口或CGI,Web服务器和一 ...
- python CGI编程-----简单的本地使用(1)
本章节需要安装python开发工具,window平台安装地址:https://www.python.org/downloads/windows/,linux安装地址:https://www.pytho ...
- Python GUI编程实践
看完了<python编程实践>对Python的基本语法有了一定的了解,加上认识到python在图形用户界面和数据库支持方面快捷,遂决定动手实践一番. 因为是刚接触Python,对于基本的数 ...
- 转:python cgi编程
转:http://www.runoob.com/Python/python-cgi.html 什么是CGI CGI 目前由NCSA维护,NCSA定义CGI如下: CGI(Common Gateway ...
- 吴裕雄--天生自然python学习笔记:Python CGI编程
什么是CGI CGI 目前由NCSA维护,NCSA定义CGI如下: CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户 ...
- Python CGI编程和CGIHTTPServer
Python2.7 的CGIHTTPServer 可以作为一个简单的HTTP服务器,能够调用cgi脚本 1 在任意目录下创建一个特殊的目录 cgi-bin ,用于存放自己写的脚本(.py或.cgi) ...
- python CGI编程Apache配置
1. 编辑http.conf,添加两行,路径可以自定义 <Directory "C:/AppServ/www/cgi-bin"> AllowOverride None ...
- Python CGI编程
CGI(Common Gateway Interface)通用网关接口,它是一段程序,运行在服务器上.如:HTTP服务器,提供同客户端HTML页面的接口. CGI程序可以是python脚本,PERL脚 ...
- Common Gateway Interface Python CGI编程
https://en.wikipedia.org/wiki/Gateway_(telecommunications) In telecommunications, the term gateway r ...
随机推荐
- element UI使用
1.Button按钮 <el-button type="text">文字按钮</el-button>设置type="text",可以是无 ...
- Spark入门(七)--Spark的intersection、subtract、union和distinc
Spark的intersection intersection顾名思义,他是指交叉的.当两个RDD进行intersection后,将保留两者共有的.因此对于RDD1.intersection(RDD2 ...
- linux工具集
1.ag:比grep.ack更快的递归搜索文件内容 安装: 1:首先在linux创建个sh文件->ag.sh 2:在ag.sh里面输入如下内容并保存 set -x TEMP_DIR=$(mkte ...
- 【Python】2.12学习笔记 变量
变量 关于变量我有一个不能理解的,关于全局变量作用域与地址的问题,学函数的时候我可能会搞懂它并且写下来 另外,其实昨天说的是有些不准确的,\(Python\)里的变量不是不用声明类型,只是声明方式特殊 ...
- debug.js在手机上打印调试信息
在做移动端开发的时候大家应该都遇到过这么一个问题:如何在手机上打印调试信息? 在pc端我们通常会用console.log 或者 alert,但大家知道console.log在手机上是看不到打印信息的: ...
- git版本控制系统小白教程(上)
前言:本文主要介绍git版本控制系统的一些基础使用,适合小白入门,因为内容较多,会分为两部分进行分享. Git介绍 Git是目前世界上最先进的分布式版本控制系统.并且它是一个开源的分布式版本控制系 ...
- c# 自定义含有标题的容器控件(标题背景为渐变色)
1.控件效果图 此效果图中的标题颜色.字号及字体可以在控件属性中设置.标题背景的渐变色及布局内容的背景色也可以在属性中设置. 2.实现的代码(用户控件) public partial class Uc ...
- Django之路由层和视图层详解
路由层 首先我们来看一下,路由层都有哪些东西,其实你看django很人性化,将所有的介绍都放在了简介里面,不信,你看
- 题解 P5681 【面积【民间数据】】
讲讲我的做法 分析题意 如果两人的面积一样大怎么办? 然后发现 输出仅一行一个字符串,若正方形面积大则输出 Alice,否则输出 Bob. 所以一样输\(Bob\) 算面积 \(Alice\)的面积就 ...
- nginx 自动化定时切割日志
NG在默认情况下,是始终输出到一个日志文件中,日志文件在nginx.conf中 : access_log logs/www.access.log main; 一个文件中不是很方便查找,分析数据, ...