GAE Python:Webapp2中Flask request.data的等价物
我需要把一些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 个回答
如果你想把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