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