CGI脚本的位置是放置在服务器的cgi-bin目录中,以确保用户的CGI脚本可以读写。
安全起见:HTTP将用户的CGI脚本当作用户的nobody来执行,而且没有任何特别权限。脚本只能读取(写入或执行)任何人都可以读取(写入或执行)的脚本。
如果需要加载的模块路径不在Python的默认路径内,可以在加载前改变脚本内的路径变量。用户只能使用“import cgi”来加载cgi模块,不能使用“from cgi import *”
一、传输信息给Python脚本
使用URL传递信息给CGI脚本的时候,所传递的数据会转换为成对的name/value。name和value之间用等号(=)隔开,每一对name/value之间以&隔开,如果有空白就会被转换成加号(+)
特定字符会被转换成十六进制的格式(%HH),eg:”Joe Anderson”会被转换为”Joe%20Anderson”。
eg:
##使用POST方法,需要使用urllib模块来传输信息import urllibfrom flask import Flaskrequest = urllib.parse.urlencode({"animal":"Monkey","age":"5"}).encode("utf-8")page = urllib.request.urlopen("http://127.0.0.1/cgi-bin/lhuan.py",request)response = page.read()
报错
Traceback (most recent call last):File "e:/Apache24/cgi-bin/chuanshu.py", line 2, in <module>request = urllib.parse.urlencode({"animal":"Monkey","age":"5"}).encode("utf-8")AttributeError: module 'urllib' has no attribute 'parse'
解决:
"方式1:"# import requests# import urllib"方式2:"from flask import Flask
URL内特定字符及其编码字符串
| 特定字符 | 编码字符串 |
|---|---|
| / | %2F |
| ~ | %7E |
| : | %3A |
| ; | %3B |
| @ | %40 |
| & | %26 |
| space | %20 |
| return | %0A |
| tab | %09 |
二、表单域的处理
每一个CGI脚本必须输出一个表头(Content-type标记)来描述文件的内容。
一般Content-type标记的值是text/html,text/plain,image/gif及image/jpeg。表头必须有一个空白行表示结尾。
客户端浏览器会读取CGI脚本返回的表头,但不会显示在网页上。
使用IIS当作网站服务器的时候,使用CGI脚本放置在网页的可执行目录\scripts中,在输入账号及密码后,单击“登录”按钮,CGI脚本会返回一个网页,显示所输入的账号及密码值,如果没有输入账号和密码,就会显示错误信息。
实例:
#简单的html文件,里面有一个表单,在表单中有两个文本框,一个用于输入用户账号,另一个用于输入用户密码,当单击“登录”之后,使用POST方法执行服务器内的CGI脚本
