Python Flask传出的帖子请求使用Passenger WSGI转换为GET

时间:2014-08-02 17:36:13

标签: python post flask passenger python-requests

昨天我遇到了这个问题并在帮助下调查了这个问题。

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处理它才会失败。

如何解决此问题的任何线索?

提前致谢。如果需要更多信息,我愿意更新,只需打电话。

更新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>

我非常确定网址是正确的,否则我不会收到405错误。

2 个答案:

答案 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请求。