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 ...
随机推荐
- 为企业提供存储功能的Red Hat Stratis 2.0.1发布了
导读 Red Hat的Stratis存储项目用于在Linux上提供企业存储功能,以与ZFS和Btrfs之类的产品竞争,同时在LVM和XFS之上构建,这是其2020年守护进程的首次更新. 通过Strat ...
- 苹果笔记本 安装 ubuntu 默认没有无线网卡 的 解决方案
sudo apt-get update sudo apt-get install bcmwl-kernel-source
- ERP系统定价模型及费用组成
很多人选择ERP系统的时候最关心的就是费用问题,因为很多中小企业资金都是比较缺乏的,如果需要使用大量的金钱来购买ERP系统这是不现实的.你知道ERP系统的定价模型有哪些吗?你知道影响ERP系统价格的因 ...
- 在macOS平台下制作SSL证书,免费域名通配符证、单域名证书、多域名证书教程
1.安装 home-brew 2.安装 certbot 在终端执行下面命令 brew install certbot 3.制作SSL证书 第一步: 在终端执行下面命令 sudo certbot cer ...
- shell脚本基础-语法
一 变量 [root@T_FOOT-Home2-ZZZ01 ~]# a=hello [root@T_FOOT-Home2-ZZZ01 ~]# echo $a hello [root@T_FOOT-Ho ...
- 6个出色的Kubernetes发行版,哪款最适合你?
作者简介 Christopher Tozzi,自2008年来以自由职业者的身份对Linux.虚拟化.容器.数据存储及其相关主题进行报道. 本文来自Rancher Labs 时至今日,通过Kuberne ...
- Python进制的转换
Python整数能够以十六进制,八进制和二进制来编写,作为一般以10位基数的十进制计数法的补充. 一: 上面三种进制的常用表示 >>> 0o1, 0o20, 0o377 # 八进制 ...
- UNIX环境高级编程——TCP/IP网络编程 常用网络信息检索函数
UNIX环境高级编程——TCP/IP网络编程 常用网络信息检索函数 gethostname() getppername() getsockname() gethostbyname() ...
- Python第六章-函数06-高阶函数
函数的高级应用 二.高阶函数 高级函数, 英文叫 Higher-order Function. 那么什么是高阶函数呢? 在说明什么是=高阶函数之前, 我们需要对函数再做进一步的理解! 2.1 函数的本 ...
- Hive学习笔记六
目录 查询 一.基本查询 1.全表和特定列查询 2.列别名 3.算术运算符 4.常用函数 5.Limit语句 二.Where语句 1.比较运算符(Between/In/ Is Null) 2.Like ...