GAE Python:Webapp2等同于Flask request.data

时间:2014-09-10 16:46:18

标签: python google-app-engine python-2.7 webapp2

我必须将某些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。

1 个答案:

答案 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