利用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
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页