【问题标题】:GAE Python: Webapp2 Equivalent of Flask request.dataGAE Python:Flask request.data 的 Webapp2 等价物
【发布时间】:2014-09-10 16:46:17
【问题描述】:

我必须将某些 Python Flask 代码转换为 Webapp2 代码(在 GAE 中使用)。

烧瓶代码sn-p

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 Identity Toolkit (Gitkit) 中提供的示例代码。
来自Flask docs

request.data

包含传入的请求数据作为字符串,以防它带有 mimetype Flask 无法处理。

根据Python docs

urllib.urlencode()

将映射对象或二元元组序列转换为 “百分比编码”字符串,适合传递给上面的 urlopen() 作为 可选数据参数。这对于传递表单字典很有用 POST 请求的字段。结果字符串是一系列 由 '&' 字符分隔的 key=value 对,其中 key 和 value 使用上面的 quote_plus() 引用。当一个二元序列 tuples 用作查询参数,每个元组的第一个元素 是一个键,第二个是一个值。 value 元素本身可以是 一个序列,在这种情况下,如果可选参数 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 等价物。

【问题讨论】:

  • 我对烧瓶了解不多,但我在应用引擎上玩的足够多,可能能够提供帮助……你能解释一下“urlencode(request.data)”在烧瓶中的作用吗?
  • @Julldar 感谢您的回复。我已经用更多数据更新了这个问题,包括你问的那个。请看一下(更新部分在最后)。

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


【解决方案1】:

如果您尝试将 POST 请求正文解析为 URL 编码参数的集合(例如 Web 表单提交的内容),则库会为您解析这些,您只需使用 @ 即可访问它们987654323@-like 接口(实际上是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

【讨论】:

  • (从技术上讲,body 已经等同于 URL 编码的 post_body,如果它开始时格式正确,但您可能需要防范格式错误或恶意输入,具体取决于您的用例。 )
  • +1,谢谢。我认为post_body = urllib.urlencode(self.request.POST.items()) 应该是答案。我不再收到 Python 错误,但收到 Gitkit 错误消息。我正在调查以确认这是一个 Gitkit 问题。一旦确认,我会将您的答案标记为已接受。
猜你喜欢
  • 2012-03-21
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多