我尝试在项目中使用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')
如何获取发布数据?
感谢您的任何帮助
在 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())
很少挖掘问题,导致了GitHub上以下链接的问题。它指出,猎鹰框架至少在其0.3版中,并且使用Python 2合作,如果恰当地逃脱了,则不会将"张贴"作为字符串解析。我们可以使用更多信息,以了解您要通过发布请求发送的数据,以及以哪种格式发送的格式,例如发送为简单的文本,或使用标题信息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')
对于正式文档,建议使用bounded_stream
,其中不确定的条件(例如内容不确定或0(,或者完全缺少标头信息。
bounded_stream 在官方猎鹰文档中描述为以下内容。
围绕流的类似文件的包装器,以正常化不同WSGI服务器采用的本机输入对象之间的某些差异。特别是,Bounded_stream意识到正文的预期内容长度,并且永远不会阻止界外读取,假设客户端在将数据传输到服务器时不会停滞不前。
Falcon接收HTTP请求作为WSGI包装器所传递的HTTP请求作为缓冲对象,它从客户端接收数据,并且由于性能原因,它可能无法在数据上运行适当的解析以将其转换为更可用的数据结构。
非常感谢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)
您要寻找的字段有些混乱,但它是req.media:
返回请求流的供应形式。当被调用时,它将尝试使用内容类型标头以及通过
falcon.RequestOptions
配置的媒体类型处理程序进行启用。
如果请求是JSON,则req.media
已经包含一个python dict。
我在falcon Framework中添加了request.py的更改,以解析应用程序/x-www-form-urlenceded和multipart/from-data。我已经提出了拉的请求-https://github.com/falconry/falcon/falcon/pull/1236,但尚未在主机中合并。检查此 - https://github.com/branelmoro/falcon
我已将新代码添加到解析,放置和删除应用程序/x-www-form-urlencoded和multipart/form-data。文本字段将在req.form_data字典中可用,上传文件缓冲区流将在req.files字典中提供。
。我希望这将有助于分别访问发布和获取参数,我们也能够上传文件。更改的好处是,它不会将整个上传的文件加载到内存中。
以下是示例代码,以显示如何使用帖子,put和删除应用程序/x-www-form-urlenCoded和multipart/form-data:
import falcon
class Resource(object):
def on_post(self, req, resp):
# req.form_data will return dictionary of text field names and their values
print(req.form_data)
# req.form_data will return dictionary of file field names and
# their buffer class FileStream objects as values
print(req.files)
# support we are uploading a image.jpg in `pancard` file field then
# req.files["pancard"] will be FileStream buffer object
# We can use set_max_upload_size method to set maximum allowed
# file size let say 1Mb = 1*1024*1024 bytes for this file
req.files["pancard"].set_max_upload_size(1*1024*1024)
# We can use uploadto method to upload file on required path (Note: absolute filepath is required)
# This method returns boolean - `True` on successful upload
# and if upload is unsuccessful then it returns `False` and sets error on failure.
path = "/tmp/" + req.files["pancard"].name
response = req.files["pancard"].uploadto("/tmp/" + path)
print(response)
# Once file is uploaded sucessfully, we can check it's size
print(req.files["pancard"].size)
# If file is not uploaded sucessfully, we can check it's error
print(req.files["pancard"].error)
resp.body = "Done file upload"
resp.status = falcon.HTTP_200
# falcon.API instances are callable WSGI apps
app = falcon.API()
things = Resource()
# things will handle post requests to the '/post_path' URL path
app.add_route('/post_path', things)
请让我知道您是否有疑问。
到目前为止...对我而言,bounded_stream.read((和stream.read((都将张贴的数据作为type str。到目前为止,我只找到了解决问题的一种方法:
def on_post(self, req, resp):
posted_data = json.loads(req.stream.read())
print(str(type(posted_data)))
print(posted_data)
接收到张贴的数据是我唯一可以提出
这是我在设计API时使用的东西。
import falcon
import json
class VerifierResource():
def on_post(self, req, resp):
credentials = json.loads(req.stream.read())
if credentials['username'] == USER
and credentials['passwd'] == PASSWORD:
resp.body = json.dumps({"status": "verified"})
else:
resp.body = json.dumps({"status": "invalid"})
api = falcon.API()
api.add_route('/verify', VerifierResource())
这将返回具有相应响应主体的序列化JSON。
有一种示例方法可以从身体中获取培养基。我用来将尸体纳入帖子方法:
def on_post(req,resp)
arguments = {}
# get body media on post method
body = req.get_media()
if 'something' in body:
arguments['something'] = body['something']
发送身体内容类型媒体类型并在代码中打印或使用,但是如果要发送JSON主体,您的代码应覆盖给JSON参数。
请让我知道您是否有疑问。