【问题标题】:Flask is not getting any POST data from a requestFlask 没有从请求中获取任何 POST 数据
【发布时间】:2014-08-01 19:26:46
【问题描述】:

在我们的服务器中,我们有一段代码调用我的 APP 中的函数,如下所示:

data = urllib.urlencode( dict(api_key="a-key-goes-here") )
headers = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36",
    "Accept" : "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,text/png,*/*;q=0.5",
    "Accept-Language" : "en-US,en;q=0.8",
    "Accept-Charset" : "ISO-8859-1,utf-8",
    "Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
}
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
code = response.code
message = response.read()
response.close()

我知道这不是使用 url_for( 也不是通过您的 APP 调用 url 的其他方式,但这有一个原因。我们的服务器只是测试调用是否正确,但 url 应该在我们的 APP 之外,所以是 api 键。

所以,我们的服务器处理 url 如下所示:

@app.route('/loan_performer', methods=["GET", "POST"])
def loan_performer():
    if 'api_key' in request.form and request.form['api_key'] == API_KEY:
        ret = dict()

        # rate1 return a random number between 3.000 and 4.000 and point1 will be 0
        ret['rate_one'] = random.randint(3000, 4000)
        ret['point_one'] = 0

        # rate2 do it between 3.500 and 4.500, point2 being 0.5
        ret['rate_two'] = random.randint(3500, 4500)
        ret['point_two'] = 0.5  

        # rate3 between 4.000 and 5.000 with 1.0
        ret['rate_three'] = random.randint(4000, 5000)
        ret['point_three'] = 1.0

        return json.dumps(ret), 200

    else:
        return u"Your API Key is invalid.", 403

我们的错误正如标题所说:

我们不断收到错误“错误请求(GET 和 HEAD 请求可能不包含请求正文)”,这是由 Passenger WSGI for Apache 处理的 404 错误。但换句话说,由于 request.form 是空的,它不应该是空的。

我做错了什么或以任何其他方式将数据从 Flask 发布到外部?

如果需要我愿意更新的更多信息,请致电。

编辑 1

我改用这样的请求:

dat = dict( api_key="a-key-goes-here" )
request = requests.post(url, data=dat)
message = request.text
code = request.status_code

它拒绝工作。这是我在处理url函数中做的记录器:

(08/02/2014 07:07:20 AM) INFO This is message ImmutableMultiDict([]) ImmutableMultiDict([])  and this code 403

request.args - request.form - request.data 都是空的,要么用urllib,要么用requests。

编辑 1 更新

从 Martin konecny 建议的方法中删除“GET”后,我收到了以下回复:

(08/02/2014 08:35:06 AM) INFO This is message <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>

这个代码是 405

【问题讨论】:

  • 2 件事。首先,在使用之前打印出 URL,以确保它与 Flask 中的匹配。第二,你有没有考虑过使用the requests library?真的很棒。
  • 请检查编辑

标签: python json flask http-post


【解决方案1】:

但换句话说,由于 request.form 是空的,它不应该是空的。

我认为你无法推断出这个结论。似乎正在发生的事情是您有一个带有 POST 标头的 GET 请求。

来自Python docs

data 可以是一个字符串,指定要发送到服务器的附加数据,或者如果不需要此类数据,则为 None。目前 HTTP 请求是唯一使用数据的请求;当提供数据参数时,HTTP 请求将是 POST 而不是 GET。 data 应该是标准 application/x-www-form-urlencoded 格式的缓冲区。 urllib.urlencode() 函数采用 2 元组的映射或序列,并以这种格式返回一个字符串。

您需要删除标题

“内容类型”:“application/x-www-form-urlencoded; charset=UTF-8”

当您发送带有空数据结构的请求时,或者只是将其全部删除(它会在需要时由urllib 自动添加)

【讨论】:

  • 我不得不将我的请求从 POST 切换到获取,因为我不知道为什么如果我继续使用 urlopen(url, data) 它会失败。我已经按照你说的做了,删除了内容类型并对字典进行了 urlencode,所以我不知道 POST 失败的原因。
  • 您的新请求方法看起来正确。删除 methods = 'GET' 以确保您只处理 POST(目前),并打印 request.form 的内容
  • 你留下methods=["POST"]了吗?
  • 另外,请先尝试不使用 api_key。运行后添加。
  • 我保留了POST方法
猜你喜欢
  • 2012-08-04
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 2017-08-27
相关资源
最近更新 更多