昨天我遇到了这个问题并在帮助下调查了这个问题。
Flask is not getting any POST data from a request
总结(你可以在我的另一篇文章中看到更多细节):
这段代码是从我的APP向我的APP发送POST请求,但不是在内部,但好像是其他APP。
dat = dict( api_key="a-key-goes-here" )
request = requests.post(url, data=dat)
message = request.text
code = request.status_code
但我对此请求的处理函数有空request.form,request.args和request.data。
这是因为来自该代码的传出POST请求被视为GET并且从不处理数据。此外,如果我尝试request.args,则ImmutableMultiDict为空。
最奇怪的是,如果APP通过Flask Server运行,这是有效的。只有从Apache Passenger WSGI处理它才会失败。
如何解决此问题的任何线索?
提前致谢。如果需要更多信息,我愿意更新,只需打电话。
根据要求,我将我的功能从另一个问题复制到此处,以便于查看。
@app.route('/loan_performer', methods=["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”方法时的响应,返回的代码是405
(08/03/2014 06:58:05 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>
当我使用“GET”方法并且代码为404
时,这是响应(08/03/2014 07:01:54 AM) INFO This is message <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>
我非常确定网址是正确的,否则我不会收到405错误。
答案 0 :(得分:1)
经过大量的工作和头痛,没有结果,我们最终切换到使用GET而不是POST。
问题似乎是在Apache配置中。由于我们在Dreamhost中使用共享服务器,因此他们似乎已经获得某种反DDoS /垃圾邮件服务,其中所有传出请求都转换为GET以避免泛滥。
当我们搬到新的非共享服务器时,我会使用您的要求,我们可以根据自己的喜好配置Apache。如果问题仍然存在,那么我会打开一个新问题。感谢所有的支持和帮助!
答案 1 :(得分:0)
我看过你指的另一个问题。您是否考虑过明确处理HTTP请求类型?例如:
from Flask import request
@app.route('/my_resource', methods=['GET', 'POST'])
def handle_resource():
if request.method == 'GET':
# Do GET stuff
if request.method == 'POST':
# Do POST stuff
这样您就可以处理POST和GET请求。