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)