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 ...
随机推荐
- HTC推出了VIVE Comos 全新 VR(虚拟现实)系列产品
据 The Verge 报道,近日,HTC 推出了 VIVE Comos 全新 VR(虚拟现实)系列产品.包括 Cosmos 精英套装.VIVE Cosmos XR 版.Cosmos Play 基础版 ...
- 基于 HTML + WebGL 结合 23D 的疫情地图实时大屏 PC 版
前言 2019年12月以来,湖北省武汉市陆续发现了多例肺炎病例,现已证实为一种新型冠状病毒感染引起的急性呼吸道传染病并蔓延全国,肺炎疫情牵动人心,人们每天起来第一件事变成了关注疫情进展,期望这场天灾早 ...
- spring boot 学习笔记(一)
学习链接:http://www.cnblogs.com/ityouknow/category/914493.html 定义 spring boot 是由pivotal 团队提供的权限框架,设计目的是用 ...
- 升级cocoapods到指定版本
把cocoapods升级到1.7.4 sudo gem install -n /usr/local/bin cocoapods -v 1.7.4
- 浅谈 HTTP中Get与Post的区别
浅谈 HTTP中Get与Post的区别 存在的误区 有人说 HTTP 协议下的 Get 请求参数长度是有大小限制的,最大不能超过XX,而 Post 是无限制的,看到这里,我想他们定是看多了一些以讹传讹 ...
- Altium Designer 20下载与安装教程
目录 一.Altium Designer 20下载 二.Altium Designer 20安装 三.Altium Designer 20破解 四.Altium Designer 20汉化 作者:st ...
- qt creator源码全方面分析(3-5)
目录 qtcreatorlibrary.pri 使用实例 上半部 下半部 结果 qtcreatorlibrary.pri 上一章节,我们介绍了src.pro,这里乘此机会,把src目录下的所有项目文件 ...
- Natas26 Writeup(PHP反序列化漏洞)
Natas26: 打开页面是一个输入坐标点进行绘图的页面. <html> <head> <!-- This stuff in the header has nothing ...
- CentOs安装配置Jenkins(一)
安装 RPM方式安装 #如果下列版本不是您需要的版本,可以到清华镜像站点查找自己需要的jenkins版本rpm地址 #清华镜像网址:https://mirrors.tuna.tsinghua.edu. ...
- 【NLP面试QA】预训练模型
目录 自回归语言模型与自编码语言 Bert Bert 中的预训练任务 Masked Language Model Next Sentence Prediction Bert 的 Embedding B ...