如何在Python CGI脚本中访问URL的查询字符串?

时间:2013-07-15 23:28:25

标签: python-2.7 apache2 cgi

我正在尝试访问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 个答案:

答案 0 :(得分:4)

如果您正在运行cgi脚本,只是想添加一个替代方法来访问QUERY_STRING值,您可以执行以下操作:

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

这段代码是从CGI Programming with Python上的TutorialsPoint tutorial获得的。

虽然,正如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

中的值

答案 1 :(得分:3)

首先,'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

答案 2 :(得分:0)

export default class Db {
  constructor (uri, callback) {
    const mongo = process.env.MONGO || 'mongodb://localhost:27017'
    this.mongodb = process.env.MONGO_DB || 'testing'
    this.gfs = null
    this.connection = MongoClient.connect(mongo, { useNewUrlParser: true })
    this.connected = false
    return this
  }

  async connect (msg) {
    if (!this.connected) {
      try {
        this.connection = await this.connection
        this.connection = this.connection.db(this.mongodb)
        this.gfs = new mongo.GridFSBucket(this.connection)
        this.connected = true
      } catch (err) {
        console.error('mongo connection error', err)
      }
    }
    return this
  }

  async disconnect () {
    if (this.connected) {
      try {
        this.connection = await this.connection.close()
        this.connected = false
      } catch (err) {
        console.error('mongo disconnection error', err)
      }
    }
  }

  async dropDB () {
    const Content = this.connection.collection('content')
    await Content.deleteMany({})
  }
}

with query_string ='k1 = val1&data = test' 它将回显:

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

image output

答案 3 :(得分:0)

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

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

导入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'))

如果(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

CONTENT_TYPE

GATEWAY_INTERFACE

PATH_INFO

PATH_TRANSLATED

QUERY_STRING

REMOTE_ADDR

REMOTE_HOST

REMOTE_IDENT

REMOTE_USER

REQUEST_METHOD

SCRIPT_NAME

SERVER_NAME

SERVER_PORT

SERVER_PROTOCOL

SERVER_SOFTWARE

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

希望这可以为您提供帮助。