我必须将某些Python Flask代码转换为Webapp2代码(在GAE中使用)。
Flask代码段
if request.method == 'POST':
post_body = urlencode(request.data)
ATTEMPT 1
if self.request.method == 'POST':
post_body = urllib.urlencode (self.request.data)
错误
::
File "/base/data/home/apps/s~myapp/1.378592258368936474/main_v3.py", line 1397, in post
post_body = urllib.urlencode (self.request.data)
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webob-1.1.1/webob/request.py", line 1238, in __getattr__
raise AttributeError(attr)
AttributeError: data
ATTEMPT 2
if self.request.method == 'POST':
post_body = urllib.urlencode (self.request.body_file)
错误
::
File "/base/data/home/apps/s~myapp/1.378591983192817348/main_v3.py", line 1397, in post
post_body = urllib.urlencode (self.request.body_file)
File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib.py", line 1292, in urlencode
if len(query) and not isinstance(query[0], tuple):
TypeError: not a valid non-string sequence or mapping object
ATTEMPT 3
if self.request.method == 'POST':
post_body = urllib.urlencode (self.request.body)
错误
::
File "/base/data/home/apps/s~myapp/1.378592109110666000/main_v3.py", line 1397, in post
post_body = urllib.urlencode (self.request.body)
File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib.py", line 1293, in urlencode
raise TypeError
TypeError: not a valid non-string sequence or mapping object
Flask request.data的正确Webapp2等价物是什么?
更新
我不知道Python Flask。我使用GAE Python。我正在尝试转换Google Identity Toolkit(Gitkit)中提供的示例代码
来自Flask docs,
request.data
包含传入的请求数据作为字符串,以防它带有 mimetype Flask无法处理。
根据Python docs,
urllib.urlencode()
将映射对象或两元素元组序列转换为a “百分比编码”字符串,适合传递给上面的urlopen()作为 可选的数据参数。这对于传递表单字典很有用 字段到POST请求。结果字符串是一系列的 key = value对由'&'分隔字符,键和值都有 使用上面的quote_plus()引用。当一个二元素的序列 元组用作查询参数,即每个元组的第一个元素 是一个关键,第二个是价值。值元素本身可以是 一个序列,在这种情况下,如果可选参数doseq是 评估为True,由'&'分隔的单个键=值对是 为键的值序列的每个元素生成。该 编码字符串中的参数顺序将与顺序匹配 序列中的参数元组。 urlparse模块提供了 函数parse_qs()和parse_qsl(),用于解析查询 字符串到Python数据结构。
我尝试了urllib2.quote (self.request.body)
并且没有出现Python错误。但是,Gitkit拒绝回复说它无效。这意味着urllib2.quote (self.request.body)
不是Python Flask urlencode(request.data)
的正确Python Webapp2。
答案 0 :(得分:1)
如果您尝试将POST请求正文解析为URL编码参数的集合(例如Web表单提交的内容),则库会为您解析这些参数,您只需使用{ {1}} - 类似接口(实际上是dict
,因为密钥可以有多个值):
MultiDict
如果您需要原始数据,field_value = self.request.POST['fieldname']
字段会为您提供有用的字符串值。您从body
获得的错误是因为该方法不接受字符串参数,它采用映射或两元组序列。也许这就是你所追求的:
urlencode()
http://docs.webob.org/en/latest/reference.html#query-post-variables https://docs.python.org/2/library/urllib.html#urllib.urlencode