我正在编写一个非常简单的Web服务,用Python编写并在Apache服务器上作为CGI运行。
根据Python文档(某处......我忘了哪里),我可以使用sys.stdin来读取随机客户端发布的数据,这一切都运行正常。但是,我希望能够读取HTTP头信息 - 传入IP,用户代理等。我现在也想通过仅使用Python库(因此没有mod-python)来保持它非常简单。我该怎么做?
答案 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")
mySpy =“ myURLSelf:[” + str(myURLSelf)+“] \ n”
mySpy = mySpy +“ myQuerySelf:[” + str(myQuerySelf)+“] \ n”
mySpy = mySpy +“ myPostData:[” + str(myPostData)+“] \ n”
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上使用此方法。