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

Python: Breaking query string into associative array not working

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

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

环境['QUERY_STRING']可以是"temperature=20&humidity=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']

返回的对象是一个数组,因此使用第二维索引有帮助。

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

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

这样试试:

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

如果每个值实际上是一个值列表,而您只想要第一个值,如上所述,请这样做:

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

我已经编辑了我的答案,因为我之前说过在循环外有多个收益是不好的。我研究了它,这是我的错误陈述。没关系..这只是有点整洁。

或者只是 return 它们作为一个简单的列表或元组,因为这些值已经在内存中并且非常小。收益率在这里并不能真正给你买任何东西。