Python Falcon - 获取POST数据

Gom*_*omi 8 python http-post falcon python-3.x falconframework

我尝试在我的项目中使用falcon包.问题是我没有找到从HTTP post请求获取正文数据的方法.

我使用了示例中的代码,但req.stream.read()没有按预期返回JSON.

代码是:

raw_json = req.stream.read()
result.json(raw_json, encoding='utf-8')
resp.body = json.dumps(result_json, encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)

如何获取POST数据?

谢谢你的帮助

小智 7

falcon 2 中,如果您使用json类型,请使用req.media

例如:

import falcon
from json import dumps

class Resource(object):
    def on_post(self, req, resp, **kwargs):
        result = req.media
        # do your job
        resp.body = dumps(result)


api = falcon.API()

api.add_route('/test', Resource())
Run Code Online (Sandbox Code Playgroud)


小智 6

很少深入研究这个问题导致了github上的以下相关问题.它声明falcon框架至少在其0.3版本中并且与Python 2一起工作时,如果它们被适当地转义,则不会将数据"POSTed"解析为字符串.我们可以使用有关您尝试通过POST请求发送的数据以及发送的格式的更多信息,例如,它是作为简单文本发送,还是使用Header Information Content-Type:application/json,或者如果是通过HTML表单.

虽然问题的确切问题尚不清楚,但我仍然可以建议尝试使用bounded_stream而不是stream:

raw_json = req.bounded_stream.read()
result.json(raw_json, encoding='utf-8')
resp.body = json.dumps(result_json, encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)

对于官方文档,建议使用bounded_stream不确定条件,例如Content-Length undefined或0,或者标题信息是否完全丢失.

bound_stream在官方falcon文档中描述如下 .

类似于文件的流包装器,用于规范不同WSGI服务器使用的本机输入对象之间的某些差异.特别是,bounded_stream知道正文的预期Content-Length,并且永远不会阻止越界读取,假设客户端在将数据传输到服务器时没有停顿.

Falcon接收HTTP请求数据作为缓冲区对象,由WSGI包装器传递,它接收来自客户端的数据,并且由于性能原因,它可能无法在数据之上运行正确的解析以转换为更有用的数据结构.


小智 5

非常感谢 Ryan(和 Prateek Jain)的回答。

解决办法很简单,把app.req_options.auto_parse_form_urlencoded=True. 例如:

import falcon

class ThingsResource(object):
    def on_post(self, req, resp):
        value = req.get_param("value", required=True)
        #do something with value

app = falcon.API()
app.req_options.auto_parse_form_urlencoded=True

things = ThingsResource()

app.add_route('/things', things)
Run Code Online (Sandbox Code Playgroud)