Python Flask发出的post请求使用Passenger WSGI转换为GET



我昨天遇到了这个问题,经过调查,我遇到了这个问题。

Flask没有从请求中获取任何POST数据

所以总结一下(你可以在我的其他帖子上看到更多细节):

这段代码是从我的应用程序发送POST请求到我的应用程序,但不是在内部,但如果它是其他应用程序。

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

但是我对这个请求的处理函数是空请求。形式,请求。参数和请求。数据。

这是因为来自该代码的传出POST请求被当作GET处理,数据从未被处理过。如果我试着请求。参数ImmutableMultiDict为空

最奇怪的是,如果应用程序是通过Flask Server运行的,这是有效的。只有当它被Apache Passenger WSGI处理时才会失败。

如何解决这个问题的线索吗?

提前感谢。如果需要更多的信息,我愿意更新,请打电话给我。

<标题>更新1

根据要求,我从另一个问题中复制了我的函数到这里,以便更容易地可视化。

@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>

我很确定URL是正确的,否则我不会收到405错误。

经过大量的工作和头痛,没有结果,我们最终改用GET而不是POST。

问题似乎在Apache配置中。因为我们在Dreamhost中使用共享服务器,所以他们似乎有某种反DDoS/垃圾邮件服务,所有传出的请求都被转换为GET,以避免洪水泛滥。

当我们移动到一个新的非共享服务器时,我会使用你的问题,我们可以根据自己的喜好配置Apache。如果问题仍然存在,那么我将打开一个新的问题。感谢所有的支持和帮助!

我已经看过你提到的另一个问题。您是否考虑过显式地处理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请求

最新更新