从Python CGI脚本中读取客户端的头文件?

时间:2010-04-20 17:39:24

标签: python cgi http-headers

我正在编写一个非常简单的Web服务,用Python编写并在Apache服务器上作为CGI运行。

根据Python文档(某处......我忘了哪里),我可以使用sys.stdin来读取随机客户端发布的数据,这一切都运行正常。但是,我希望能够读取HTTP头信息 - 传入IP,用户代理等。我现在也想通过仅使用Python库(因此没有mod-python)来保持它非常简单。我该怎么做?

4 个答案:

答案 0 :(得分:16)

如果您作为CGI运行,则无法直接读取HTTP标头,但Web服务器会将大部分信息放入环境变量中。你可以从os.environ []

中选择它

可能存在的环境变量列表很长。您可以通过Web搜索“公共网关接口”找到它。例如,在http://www.ietf.org/rfc/rfc3875.txt中,它们被称为“元变量”。

答案 1 :(得分:9)

这些是通过环境提供给CGI脚本的:

import os
user_agent = os.environ["HTTP_USER_AGENT"]
ip = os.environ["REMOTE_ADDR"]

答案 2 :(得分:4)

正如this page所解释的那样,大多数HTTP请求标头都可以通过环境变量提供给CGI脚本。运行cgi.test()而不是您的脚本,以查看显示在您访问的浏览器中的环境(包括HTTP请求标头)。

答案 3 :(得分:0)

这是我在Python 3中从CGI(A)URL,(B)GET参数和(C)POST数据捕获的方式:

================================================ ========

导入sys,os,io

捕获网址

myDomainSelf = os.environ.get('SERVER_NAME')

myPathSelf = os.environ.get('PATH_INFO')

myURLSelf = myDomainSelf + myPathSelf

捕获获取数据

myQuerySelf = os.environ.get('QUERY_STRING')

捕获发布数据

myTotalBytesStr =(os.environ.get('HTTP_CONTENT_LENGTH'))

如果(myTotalBytesStr == None):

myJSONStr = '{"error": {"value": true, "message": "No (post) data received"}}'

其他:

myTotalBytes=int(os.environ.get('HTTP_CONTENT_LENGTH'))

myPostDataRaw = io.open(sys.stdin.fileno(),"rb").read(myTotalBytes)

myPostData = myPostDataRaw.decode("utf-8")

将RAW写入文件

mySpy =“ myURLSelf:[” + str(myURLSelf)+“] \ n”

mySpy = mySpy +“ myQuerySelf:[” + str(myQuerySelf)+“] \ n”

mySpy = mySpy +“ myPostData:[” + str(myPostData)+“] \ n”

您需要在此处定义自己的myPath

myFilename =“ spy.txt”

myFilePath = myPath +“ \” + myFilename

myFile = open(myFilePath,“ w”)

myFile.write(mySpy)

myFile.close()

================================================ ========

还有其他一些有用的CGI环境变量:

AUTH_TYPE

CONTENT_LENGTH

CONTENT_TYPE

GATEWAY_INTERFACE

PATH_INFO

PATH_TRANSLATED

QUERY_STRING

REMOTE_ADDR

REMOTE_HOST

REMOTE_IDENT

REMOTE_USER

REQUEST_METHOD

SCRIPT_NAME

SERVER_NAME

SERVER_PORT

SERVER_PROTOCOL

SERVER_SOFTWARE

================================

我在Windows Server和CIIS模式下的MIIS和Python 3上使用此方法。