Python:将查询字符串分解为关联数组不起作用

时间:2015-10-06 21:28:50

标签: python parsing query-string fastcgi wsgi

这是一个Python脚本,用于解析查询字符串中的值。

当放置在独立的Python脚本中时,app内部的块功能正常。但是当放置在app()函数中时,温度,湿度,风和时间的值是空的,这是错误的。

环境[' QUERY_STRING']可以是"温度= 20&湿度= 50& wind = 30& time = morning"

这不起作用:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import sys, os
from flup.server.fcgi import WSGIServer

import urlparse
import cgi

def app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])

    qs = environ['QUERY_STRING'] # EQUALS temperature=20&humidity=50&wind=30&time=morning
    parsed = cgi.parse_qs(qs) # tried both cgi and urlparse

    yield parsed['temperature']
    yield parsed['humidity']
    yield parsed['wind']
    yield parsed['time']

WSGIServer(app).run()

错误:

/usr/local/lib/python2.7/site-packages/flup/server/fcgi_base.py in write(data=['20'])
   1062 
   1063         def write(data):
=> 1064             assert type(data) is str, 'write() argument must be string'
   1065             assert headers_set, 'write() before start_response()'
   1066 

这有效:

qs = "temperature=20&humidity=50&wind=30&time=morning"
parsed = cgi.parse_qs(qs)
print parsed['temperature']
print parsed['humidity']
print parsed['wind']
print parsed['time']

输出:

['20']
['50']
['30']
['morning']

2 个答案:

答案 0 :(得分:1)

是的,app()的返回值应该是可迭代的。我不是WSGI专家,所以我检查了fcgi源代码以确保。

试试这样:

for k in ('temperature', 'humidity', 'wind', 'time'):
    yield parsed[k]

如果每个值实际上都是一个值列表,而您只想要第一个,如上所述,请按以下方式执行:

for k in ('temperature', 'humidity', 'wind', 'time'):
    yield parsed[k][0]

我已经编辑了我的答案,因为我之前说过在循环之外有多个产量是不行的。我研究了它,这对我来说是不正确的陈述。没关系..这只是有点整洁。

或者只是将它们作为简单的列表或元组返回,因为值已经在内存中并且非常小。收益率并没有真正给你买任何东西。

答案 1 :(得分:0)

返回的对象是一个数组,所以使用第二个dimmension索引帮助。

yield parsed['temperature'][0]
yield parsed['humidity'][0]
yield parsed['wind'][0]
yield parsed['time'][0]