简体   繁体   English

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

[英]Reading a client's header from Python CGI script?

I'm writing a very simple web service, written in Python and run as CGI on an Apache server. 我正在编写一个非常简单的Web服务,用Python编写并在Apache服务器上作为CGI运行。

According to Python docs (somewhere... I forgot where), I can use sys.stdin to read the data POSTed by a random client, and this has been working fine. 根据Python文档(某处......我忘了哪里),我可以使用sys.stdin来读取随机客户端发布的数据,这一切都运行正常。 However, I would like to be able to read the HTTP header information as well - incoming IP, user agent, and so on. 但是,我希望能够读取HTTP头信息 - 传入IP,用户代理等。 I'd also like to keep it very simple for now, by using only Python libraries (so no mod-python). 我现在也想通过仅使用Python库(因此没有mod-python)来保持它非常简单。 How do I do this? 我该怎么做呢?

If you are running as a CGI, you can't read the HTTP header directly, but the web server put much of that information into environment variables for you. 如果您作为CGI运行,则无法直接读取HTTP标头,但Web服务器会将大部分信息放入环境变量中。 You can just pick it out of os.environ[] 你可以从os.environ []中选择它

The list of environment variables that might be there is pretty long. 可能存在的环境变量列表很长。 You can find it by doing a web search for "common gateway interface". 您可以通过Web搜索“公共网关接口”找到它。 For example, in http://www.ietf.org/rfc/rfc3875.txt they are called "meta-variables". 例如,在http://www.ietf.org/rfc/rfc3875.txt中,它们被称为“元变量”。

These are given to the CGI script through the environment: 这些是通过环境提供给CGI脚本的:

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

As this page explains, most HTTP request headers are made available to your CGI script via environment variables. 本页所述 ,大多数HTTP请求标头都可通过环境变量提供给CGI脚本。 Run cgi.test() instead of your script to see the environment (including HTTP request headers) shown back to your visiting browser. 运行cgi.test()而不是脚本,以查看显示回访问浏览器的环境(包括HTTP请求标头)。

This is how I capture in Python 3 from CGI (A) URL, (B) GET parameters and (C) POST data: 这是我在Python 3中从CGI(A)URL,(B)GET参数和(C)POST数据中捕获的方式:

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

import sys, os, io import sys,os,io

CAPTURE URL 捕获URL

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

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

myURLSelf = myDomainSelf + myPathSelf myURLSelf = myDomainSelf + myPathSelf

CAPTURE GET DATA 捕获数据

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

CAPTURE POST DATA 捕获发布数据

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

if (myTotalBytesStr == None): if(myTotalBytesStr == None):

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

else: 其他:

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

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

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

Write RAW to FILE 将RAW写入文件

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

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

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

You need to define your own myPath here 您需要在此处定义自己的myPath

myFilename = "spy.txt" myFilename =“spy.txt”

myFilePath = myPath + "\\" + myFilename myFilePath = myPath +“\\”+ myFilename

myFile = open(myFilePath, "w") myFile = open(myFilePath,“w”)

myFile.write(mySpy) myFile.write(mySpy)

myFile.close() myFile.close()

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

Here are some other useful CGI environment vars: 以下是一些其他有用的CGI环境变量:

AUTH_TYPE AUTH_TYPE

CONTENT_LENGTH CONTENT_LENGTH

CONTENT_TYPE 内容类型

GATEWAY_INTERFACE GATEWAY_INTERFACE

PATH_INFO PATH_INFO

PATH_TRANSLATED PATH_TRANSLATED

QUERY_STRING 请求参数

REMOTE_ADDR REMOTE_ADDR

REMOTE_HOST 远程主机

REMOTE_IDENT REMOTE_IDENT

REMOTE_USER REMOTE_USER

REQUEST_METHOD REQUEST_METHOD

SCRIPT_NAME SCRIPT_NAME

SERVER_NAME 服务器名称

SERVER_PORT 服务器端口

SERVER_PROTOCOL SERVER_PROTOCOL

SERVER_SOFTWARE SERVER_SOFTWARE

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

I am using this methods on Windows Server with MIIS and Python 3 in CGI mode. 我在Windows Server上使用此方法,在CGI模式下使用MIIS和Python 3。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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