Search code examples
pythonpython-3.xcgiwsgi

moving from python cgi to wsgi - capturing query arguments


Now that python's cgi module is scheduled to be removed, I am trying to move to wsgi. My first step is to try using from wsgiref.handlers import CGIHandler.

I have managed to get it to work by collecting GET arguments using args=environ('QUERY_STRING'), but I have not been able to get: urlparse(environ['wsgi.input'].readline().decode('utf-8')) or several similar alternatives (for example: urlparse(environ['wsgi.input'].read(length).decode('utf-8')) to provide QUERY_STRING arguments.

How do I make this test script work:

#!/usr/bin/env python3                                                                            

from wsgiref.handlers import CGIHandler
from urllib.parse import urlparse, parse_qs

def app2(environ, start_response):

    status = '200 OK'
    headers = [('Content-type', 'text/plain')]
    start_response(status, headers)

    form = urlparse(environ['wsgi.input'].readline())

    body += "type(form.query): %s -- %s\n"%(str(type(form.query)),str(form.query))
    query = parse_qs(form.query)
    body += "type(form.params): %s -- %s\n"%(str(type(form.params)),str(form.params))
    params = parse_qs(form.params)
    body += 'query: %s\n'%(str(query))
    body += 'params: %s\n'%(str(params))

    return [body.encode('utf-8')]

if __name__ == "__main__":
    CGIHandler().run(app2)

Solution

  • Quick and dirty:

    post_data = json.load(environ['wsgi.input'])
    

    Then simply refer to:

    post_data['field_name']