这是一个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']
答案 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]