0

mysql输出:

    b.query("select * from b where a='" + c + "' limit 1")
    result = b.store_result()
    d = result.fetch_row(0)

WSGI 脚本的底部:

start_response('200 OK', [('content-type', 'text/html')])
return [d]

阿帕奇错误:

 TypeError: sequence of byte string values expected, value of type tuple found

如果可能,我想使用“yield”而不是“return”。

因为通常我使用“yield”所以如果我想在网络上以原始方式查看 mysql 输出..

我应该怎么办 ?

4

1 回答 1

0

看起来您正在使用与 Python DB-API 兼容的驱动程序。要获得最佳答案,您应该真正包括您正在使用的库和数据库驱动程序。

无论哪种方式,您当前都有一个不安全的操作,对于某种未转义的 SQL 注入漏洞利用已经成熟。

首先将您的查询更改为:

b.query("select * from b where a=%s limit 1", c)
result = b.store_result()

WSGI 只需要返回 str() 对象,而您返回的是值元组。你要回来text/html了,所以你可能想做这样的事情:

def csvify(row):
    return ",".join([str(col) for col in row])
start_response('200 OK', [('content-type', 'text/html')])
return ["<html><body><pre>"] + [ csvify(row) for row in results ] + ["</pre></body></html>"]

如果您想使用 yield,只需创建并返回一个生成器而不是列表。

def csvify(row):
    return ",".join([str(col) for col in row])
def my_response_generator(results):
    yield "<html><body><pre>"
    for row in results:
        yield csvify(row)
    "</pre></body></html>"
start_response('200 OK', [('content-type', 'text/html')])
return my_response_generator(result)

我强烈建议不要手动生成自己的 HTML 和 WSGI 响应,而是使用一个简单的框架flask来抽象出很多样板。像这样的模板系统jinja可以显着提高阅读、编写、维护和扩展的能力。

于 2014-08-08T13:20:28.020 回答