3

我正在尝试在 python 脚本中访问查询字符串:在 bash 中,我将使用${QUERY_STRING}环境变量访问它。

我遇到过这样的事情:https://stackoverflow.com/a/2764822/32836,但是这个脚本由 Apache2 运行:

#!/usr/bin/python

print self.request.query_string

什么也不打印,在命令行中,同样会产生这个错误:

$ ./testing.py
Traceback (most recent call last):
  File "./testing.py", line 3, in <module>
    print self.request.query_string
NameError: name 'self' is not defined

如何阅读query_string

4

4 回答 4

6

首先,“self”关键字只能在函数中定义一次,通常是对象的。它的使用方式通常与在其他 OOP 语言中使用“this”的方式相同。

现在,您尝试使用的代码片段适用于 Google App Engine,您尚未导入(我猜也未安装)。由于您习惯于使用环境变量,因此您可以执行以下操作:

#!/usr/bin/python
import os

print os.environ.get("QUERY_STRING", "No Query String in url")

但是,我建议您改用 cgi 模块。在此处阅读更多信息:http: //docs.python.org/2/library/cgi.html

于 2013-07-16T00:16:07.540 回答
6

就像QUERY_STRING在运行 cgi 脚本时添加访问值的替代方法一样,您可以执行以下操作:

import os
print "content-type: text/html\n" # so we can print to the webpage
print os.environ['QUERY_STRING']

我的测试和理解是,当 URL 中没有任何查询字符串时,这也有效,你只会得到一个空字符串。

这已确认正在处理2.7.6,查看所有环境变量,如下所示:

#!/usr/bin/python

import os

print "Content-type: text/html\r\n\r\n";
print "<font size=+1>Environment</font><\br>";
for param in os.environ.keys():
    print "<b>%20s</b>: %s<\br>" % (param, os.environ[param])

这段代码是从关于使用 Python 进行 CGI 编程的TutorialsPoint 教程中获得的。

虽然,正如zombie_raptor_jesus 所提到的,使用 Python 的 CGI 模块可能会更好,使用 FieldStorage 会使事情变得更容易。

再次来自上面的教程:

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

将保存查询字符串中的值first_name=Bobby&last_name=Ray

于 2015-10-28T03:37:51.717 回答
1

这就是我在 Python 3 中从 CGI (A) URL、(B) GET 参数和 (C) POST 数据中捕获的方式:

我在通过 MIIS 使用 CGI 运行 Python 3 的 Windows Server 上使用这些方法。

import sys, os, io

# CAPTURE URL

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

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

myURLSelf = myDomainSelf + myPathSelf


# CAPTURE GET DATA

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

# CAPTURE POST DATA

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

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

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

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

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


# You need to define your own myPath here
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_IDENT

REMOTE_USER

REQUEST_METHOD

SCRIPT_NAME

服务器名称

服务器端口

SERVER_PROTOCOL

服务器软件

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

希望这可以帮到你。

于 2019-01-23T01:28:45.367 回答
0
import os
print('Content-Type: text/html\n\n<h1>Search query/h1>')
query_string = os.environ['QUERY_STRING']
SearchParams = [i.split('=') for i in query_string.split('&')] #parse query string
# SearchParams is an array of type [['key','value'],['key','value']]
# for example 'k1=val1&data=test' will transform to 
#[['k1','val1'],['data','test']]
for key, value in SearchParams:
    print('<b>' + key + '</b>: ' + value + '<br>\n')

使用 query_string = 'k1=val1&data=test' 它会回显:

<h1>Search query</h1>
<b>k1</b>: val1<br>
<b>data</b>: test<br>

图像输出

于 2018-12-27T12:09:16.663 回答