【问题标题】:How to get data from webapp2.Request如何从 webapp2.Request 获取数据
【发布时间】:2013-07-22 13:42:57
【问题描述】:

我无法将一串字节(图像)发送到我的后端。

在我的代码中:

#  sends a httplib2.Request
backend_resp, backend_content = self.mirror_service._http.request(
                                uri=backend_path, 
                                body=urllib.urlencode({"img":content}))

这会发送一个请求,其中content 是一大串字节。

在我的后端我有:

class Handler(webapp2.RequestHandler):
  def get(self):
    image_bytes = self.request.get("img")
    logging.info(image_bytes) # output is empty string

记录一个空字符串。

我也试过

image_bytes = self.request.body

只是在请求中设置body = content,但这些也没有返回任何内容

我知道后端正在接收请求,因为后端日志中有我放置的消息。

发送和检索我的 GET 数据的正确方法是什么?

编辑:

这是content 在尝试将其发送到我的后端之前记录的内容:

logging.info(str(type(content)))
# returns <type 'str'>

logging.info(content)
# logs a long string of bytes

另一方面,我在发送请求时也在日志中收到此警告,但我不确定如何解决:

new_request() takes at most 1 positional argument (2 given)

我猜这个警告意味着它需要的第一个位置参数是path=,它忽略了我的body= 参数。如果我添加method="POST"method="GET",我认为警告会更改为(3 given)

我也尝试使用 POST 方法,但 logging.info 不会显示在我的日志中。我尝试将self.request.bodyself.request.get('img') 写回响应,但它仍然像GET 方法一样返回一个空字符串。

【问题讨论】:

  • 用post而不是get来提交数据可能是个好主意。我不确定 mirror_service 是如何工作的..
  • 我可能最终会使用 POST,但是当我将 logging.info 调用放在 post 方法中时,它们不会出现在我的日志中
  • mirror_service 需要做一个 http post 而不是 http get 以便你看到 post 变量在 webapp2 的 post 处理程序中出现
  • 尝试更改为 POST 方法,使用 self.request.bodyself.request.get('img') 访问数据并将其写入响应,但它只返回一个空字符串。我主要担心的是content 永远不会到达 RequestHandler,或者我访问错了
  • 顺便说一句,我添加了另一个警告,如果这可能暗示问题,我会回答主要问题

标签: python google-app-engine webapp2 google-mirror-api


【解决方案1】:

从 httplib2 发送帖子:

import urllib
import httplib2

http = httplib2.Http()

url = '<your post url>'   
body = {'img': 'all your image bytes...'}
headers = {'Content-type': 'application/x-www-form-urlencoded'}
response, content = http.request(url, 'POST', headers=headers, body=urllib.urlencode(body))

see httplib2 docs

Webapp2接收帖子:

class Handler(webapp2.RequestHandler):
  def post(self):
    image_bytes = self.request.POST.get("img")
    logging.info(image_bytes) # output is empty string

我没有测试过这段代码,但它应该让你知道应该如何做。

【讨论】:

  • 感谢您的帮助。看来问题可能出在我试图从Handler 返回content 上。我在处理程序的日志中收到302 响应,对吗?我正在写这样的回复:self.response.out.write("Stuff here") 我尝试了你的代码,但是使用 GET 并且self.request.GET 是空的
  • 如果你使用 get,它只是 self.request.get("yourvariable")。 302是重定向,你在重定向吗?
  • 我没有明确地重定向到任何地方。 self.request.get("img") 是一个空字符串。 str(self.request.GET) 还返回 UnicodeMultiDict([]),这让我觉得发送数据时出了点问题。我可能会通过大小限制吗?
  • 下载 fiddler 看看有什么通过网络。我已经向您展示了如何将 webapp2 与 post 处理程序一起使用。您应该/需要执行 POST 以将图像数据作为字符串发送。 appengine 请求大小有 10mb 的限制。
  • 好的,那我就坚持 POST。 urllib2.urlopen(path,data) 会起作用还是我应该坚持使用httplib2.Http.request
猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 2022-10-19
  • 2015-06-02
  • 1970-01-01
  • 2016-11-15
相关资源
最近更新 更多