Jamie
Jamie

Reputation: 7421

How do I access the URL's Query String in a Python CGI script?

I'm trying to access the query string in a python script: in bash I'd access it using the ${QUERY_STRING} environment variable.

I've come across things like this:https://stackoverflow.com/a/2764822/32836, but this script, as run by Apache2:

#!/usr/bin/python

print self.request.query_string

prints nothing, and at the command line, the same produces this error:

$ ./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

How do I read the query_string?

Upvotes: 4

Views: 16841

Answers (4)

Al-Noor Ladhani
Al-Noor Ladhani

Reputation: 2433

This is how I capture in Python 3 from CGI (A) URL, (B) GET parameters and (C) POST data:

I am using these methods on Windows Server running Python 3 using CGI via MIIS.

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

Here are some other useful CGI environment vars:

  • 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

Hope this can help you.

Upvotes: 1

super user
super user

Reputation: 1

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

with query_string = 'k1=val1&data=test' it will echo:

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

image output

Upvotes: 0

matrixanomaly
matrixanomaly

Reputation: 6947

Just like to add an alternate method to accessing the QUERY_STRING value if you're running a cgi script, you could just do the following:

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

My testing and understanding is that this also works when there aren't any query strings in the URL, you'd just get an empty string.

This is confirmed to be working on 2.7.6, view all environment variables like so:

#!/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])

This snippet of code was obtained from a TutorialsPoint tutorial on CGI Programming with Python.

Although, as zombie_raptor_jesus mentioned, it's probably better to use Python's CGI module, with FieldStorage to make things easier.

Again from the above tutorial:

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

Will save values from the Query String first_name=Bobby&last_name=Ray

Upvotes: 6

zombie_raptor_jesus
zombie_raptor_jesus

Reputation: 86

First of all, the 'self' keyword is only available once defined in a function, typically an object's. It is normally used the same way 'this' is used in other OOP languages.

Now, the snippet of code you were trying to use was intended for the Google App Engine, which you have not imported (nor installed, I presume). Since you are accustomed to using environment variables, here's what you can do:

#!/usr/bin/python
import os

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

However, I would advise you to use the cgi module instead. Read more about it here: http://docs.python.org/2/library/cgi.html

Upvotes: 7

Related Questions