[英]Reading a client's header from Python CGI script?
我正在编写一个非常简单的Web服务,用Python编写并在Apache服务器上作为CGI运行。
根据Python文档(某处......我忘了哪里),我可以使用sys.stdin来读取随机客户端发布的数据,这一切都运行正常。 但是,我希望能够读取HTTP头信息 - 传入IP,用户代理等。 我现在也想通过仅使用Python库(因此没有mod-python)来保持它非常简单。 我该怎么做呢?
如果您作为CGI运行,则无法直接读取HTTP标头,但Web服务器会将大部分信息放入环境变量中。 你可以从os.environ []中选择它
可能存在的环境变量列表很长。 您可以通过Web搜索“公共网关接口”找到它。 例如,在http://www.ietf.org/rfc/rfc3875.txt中,它们被称为“元变量”。
这些是通过环境提供给CGI脚本的:
import os
user_agent = os.environ["HTTP_USER_AGENT"]
ip = os.environ["REMOTE_ADDR"]
如本页所述 ,大多数HTTP请求标头都可通过环境变量提供给CGI脚本。 运行cgi.test()而不是脚本,以查看显示回访问浏览器的环境(包括HTTP请求标头)。
这是我在Python 3中从CGI(A)URL,(B)GET参数和(C)POST数据中捕获的方式:
================================================== =====
import 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'))
if(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
内容类型
GATEWAY_INTERFACE
PATH_INFO
PATH_TRANSLATED
请求参数
REMOTE_ADDR
远程主机
REMOTE_IDENT
REMOTE_USER
REQUEST_METHOD
SCRIPT_NAME
服务器名称
服务器端口
SERVER_PROTOCOL
SERVER_SOFTWARE
=================================
我在Windows Server上使用此方法,在CGI模式下使用MIIS和Python 3。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.