Flask未能从请求中获取任何POST数据

1 投票
1 回答
7885 浏览
提问于 2025-04-18 15:41

在我们的服务器上,有一段代码在调用我应用程序里的一个函数,像这样:

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(也没有其他方法通过应用程序调用网址),但这样做是有原因的。我们的服务器只是测试这个调用是否正确,但这个网址预计是在我们的应用程序外部,API密钥也是如此。

所以,我们的服务器处理网址的方式是这样的:

@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请求不能包含请求体)”,这是一个404错误,由Passenger WSGI为Apache处理。换句话说,request.form为空,但它不应该是这样的。

我是不是做错了什么,或者有没有其他方法可以从Flask向外部发送数据?

如果需要更多信息,我随时可以更新,只要告诉我就行。

编辑 1

我改用requests,像这样:

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

但它就是不工作。这是我在处理网址函数中做的日志记录:

(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

1 个回答

1

换句话说,request.form为空是有原因的,但它本不应该是这样的。

我觉得你不能这样得出结论。看起来你是用GET请求却带上了POST的头信息。

根据Python文档的说明:

data可以是一个字符串,用来指定要发送给服务器的额外数据,或者如果不需要这些数据,可以是None。目前,只有HTTP请求会使用data;当提供了data参数时,HTTP请求会变成POST而不是GET。data应该是标准的application/x-www-form-urlencoded格式的缓冲区。urllib.urlencode()函数接受一个映射或一系列二元组,并返回这种格式的字符串。

当你发送一个空的数据结构时,需要去掉这个头信息:

"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"

或者干脆把它全部去掉(当需要时,urllib会自动添加这个头信息)。

撰写回答