GAE Python:Webapp2中Flask request.data的等价物

1 投票
1 回答
824 浏览
提问于 2025-04-20 22:18

我需要把一些Python Flask的代码转换成Webapp2的代码(在Google App Engine上使用)。

Flask代码片段

if request.method == 'POST':
    post_body = urlencode(request.data)

尝试 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

尝试 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

尝试 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身份工具包(Gitkit)中提供的示例代码。
根据Flask文档

request.data

包含了传入请求的数据,格式是字符串,如果请求的内容类型是Flask无法处理的。

根据Python文档

urllib.urlencode ()

将一个映射对象或一系列包含两个元素的元组转换成一个“百分比编码”的字符串,这个字符串适合传递给urlopen()作为可选的数据参数。这在将表单字段的字典传递给POST请求时非常有用。生成的字符串是一系列用'&'字符分隔的key=value对,其中key和value都使用quote_plus()进行编码。当使用一系列两个元素的元组作为查询参数时,每个元组的第一个元素是key,第二个元素是value。value本身可以是一个序列,在这种情况下,如果可选参数doseq为True,则会为每个value序列的元素生成单独的key=value对,并用'&'分隔。编码字符串中的参数顺序将与序列中的参数元组顺序一致。urlparse模块提供了parse_qs()和parse_qsl()函数,用于将查询字符串解析为Python数据结构。

我尝试了urllib2.quote (self.request.body),没有出现Python错误。但是,Gitkit拒绝了这个响应,表示它无效。这意味着urllib2.quote (self.request.body)并不是Python Flask中urlencode(request.data)的正确Webapp2对应写法。

1 个回答

1

如果你想把POST请求的内容当作一组URL编码的参数来解析(比如说网页表单提交的数据),这个库会帮你处理这些参数,你只需要像使用字典一样访问它们(实际上是一个叫做MultiDict的东西,因为一个键可以对应多个值):

field_value = self.request.POST['fieldname']

如果你想要原始数据,可以通过body字段获取一个有用的字符串。你从urlencode()得到的错误是因为这个方法不接受字符串作为参数,它需要一个映射或者一对对的序列。也许你想要的就是这个:

post_body = urllib.urlencode(self.request.POST.items())

http://docs.webob.org/en/latest/reference.html#query-post-variables https://docs.python.org/2/library/urllib.html#urllib.urlencode

撰写回答