WSGI如何在浏览器上打印原始MYSQL输出

时间:2014-08-08 12:05:19

标签: python python-2.7 python-3.x wsgi python-db-api

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]

apache错误:

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

如果可能的话,我想使用“收益”而不是“返回”。

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

我该怎么办?

1 个答案:

答案 0 :(得分: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这样的模板系统可以显着提高读取,写入,维护和扩展能力。