繁体   English   中英

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

[英]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

捕获URL

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")

将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

内容类型

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM