利用wampserver实现Python的CGI编程
下载安装wampserver
网盘下载:
链接:https://pan.baidu.com/s/1Bqd0EWMiuAiydlShDUm9Ig
提取码:w0pn
wamp中配置python
WAMP中集成了apache,php,mysql。但如果想用python来写cgi程序,就需要进行单独的配置。
1.找到Wamp安装目录下,apache的配置文件,并打开,如下图
2.到找配置文件中的以下行,在FollowSymLinks后添加ExecCGI关键字
Options+Indexes+FollowSymLinks
3.到找配置文件中的以下行,
#AddHandler allows you to map certain file extensions to “handlers”:
把在此行下部的AddHandler cgi-script所在行,变成
启动wamp
图标由红变黄再变绿表示启动成功
若一直处于黄,需要进行以下验证:
1.查看wamp安装目录是否是全英文;
2.查看服务中apache服务器是否启动
服务器未启动查找原因:
(1)查找下面目录中,点击httpd,看看有没有报错,如有根据提示进行修正
(2)安装的wamp默认80端口,打开命令行,输入netstat -ano,查看80端口是否被占用
创建CGI程序
1.编写python代码,标红部分为安装python位置,必须有
2.将编写好的.py文件放入wamp内的www文件下
3.浏览器输入 localhost/hello.py ,查看python文件输出的结果
4.输出CGI的环境变量
import os
print("Content-type:text/html")
print() #告诉服务器结束头部
print("<b>环境变量</b><br>");
print("<ul>")
for key in os.environ.keys():
print("<li><span style='color:green'>%30s </span> : %s </li>" % (key,os.environ[key]))
print("</ul>")
CGI数据传输
GET方法传输数据
# CGI处理模块
import cgi, cgitb
# 创建 FieldStorage 的实例化
form = cgi.FieldStorage()
# 获取数据
site_name = form.getvalue('name')
site_age = form.getvalue('age')
print("Content-type:text/html")
print()
print("<h2>姓名:%s 年龄:%s</h2>" %(site_name,site_age))
POST方法传输数据
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="/hello_get.py" method="post">
姓名: <input type="text" name="name"> <br />
年龄: <input type="text" name="age" />
<input type="submit" value="提交" />
</form>
</body>
</html>
CGI中使用Cookie
设置Cookie
通过http头部来设置
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
参数说明:
name=name: 需要设置cookie的值(name不能使用";"和","号),有多个name值时用 ";" 分隔,例如:name1=name1;name2=name2;name3=name3。
expires=date: cookie的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"
path=path: 设置cookie支持的路径,如果path是一个路径,则cookie对这个目录下的所有文件及子目录生效,例如: path="/cgi-bin/",如果path是一个文件,则cookie指对这个文件生效,例如:path="/cgi-bin/cookie.cgi"。
domain=domain: 对cookie生效的域名,例如:domain="www.runoob.com"
secure: 如果给出此标志,表示cookie只能通过SSL协议的https服务器来传递。
cookie的接收是通过设置环境变量HTTP_COOKIE来实现的,CGI程序可以通过检索该变量获取cookie信息。
例子:
#!C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe
#Python中CGI中文乱码解决
import codecs, sys
sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer)
print('Content-Type: text/html')
print('Set-Cookie: name="晓红";age="23"')
print()
print("""
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>Cookie设置成功!</h1>
</body>
</html>
""")
#!C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe
#Python中CGI中文乱码解决
import codecs, sys
sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer)
import http.cookies
import datetime
import random
expiration = datetime.datetime.now() + datetime.timedelta(days=30)
cookie = http.cookies.SimpleCookie()
cookie["message"] = '111'
cookie["message"]["domain"] = ""
cookie["message"]["path"] = "/"
cookie["message"]["expires"] = expiration.strftime("%a, %d-%b-%Y %H:%M:%S PST")
print("Content-Type:text/html")
print(cookie.output())
print()
print("""
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>Cookie设置成功!</h1>
<a href='/getCookie.py'>获取Cookie</a>
</body>
</html> """)
检索Cookie
#!C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe
#Python中CGI中文乱码解决
import codecs, sys
sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer)
# 导入模块
import os
import http.cookies
print("Content-type: text/html")
print()
print("""
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>读取cookie信息</h1>
""")
if 'HTTP_COOKIE' in os.environ:
cookie_string=os.environ.get('HTTP_COOKIE')
c=http.cookies.SimpleCookie()
c.load(cookie_string)
try:
data=c['message'].value
print("得到的message是: "+data+"<br>")
except KeyError:
print("cookie 没有设置或者已过期<br>")
print("""
</body>
</html>
""")
结果:
文件上传
<form enctype="multipart/form-data" action="/save_file.py" method="post">
<p>选中文件: <input type="file" name="filename" /></p>
<p><input type="submit" value="上传" /></p>
</form>
#!C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe
#Python中CGI中文乱码解决
import codecs, sys
sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer)
import cgi, os
import cgitb; cgitb.enable()
form = cgi.FieldStorage()
# 获取文件名
fileitem = form['filename']
# 检测文件是否上传
if fileitem.filename:
# 设置文件路径
fn = os.path.basename(fileitem.filename)
#open('/tmp/' + fn, 'wb').write(fileitem.file.read())
message = '文件 "' + fn + '" 上传成功'
else:
message = '文件没有上传'
print("""\
Content-Type: text/html\n
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<p>%s</p>
</body>
</html>
"""% (message,))
文件下载
#!C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe
# HTTP 头部
print("Content-Disposition: attachment; filename=\"aaa.txt\"");
print("Content-type:text/html")
print()
print("<span>文件下载成功</span>")
# 打开文件
fo = open("aaa.txt", "rb")
print(fo)
str = fo.read();
print(str)
# 关闭文件
fo.close()
注意若出现以下错误:将httpd.conf中的AllowOverride None 改为 AllowOverride All