Python 使用WSGI将传出post请求转换为GET

Python 使用WSGI将传出post请求转换为GET,python,post,flask,passenger,python-requests,Python,Post,Flask,Passenger,Python Requests,我昨天遇到了这个问题,在帮助下调查我遇到的这个问题 总之(你可以在我的另一篇文章中看到更多细节): 这段代码正在从我的应用程序向我的应用程序发送POST请求,但不是在内部,而是好像它是其他应用程序一样 dat = dict( api_key="a-key-goes-here" ) request = requests.post(url, data=dat) message = request.text code = request.status_code 但是我对这个请求的处理函数有空的re

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

总之(你可以在我的另一篇文章中看到更多细节):

这段代码正在从我的应用程序向我的应用程序发送POST请求,但不是在内部,而是好像它是其他应用程序一样

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也是空的

最奇怪的是,如果应用程序是通过Flask服务器运行的,那么它就可以工作。只有从ApachePassenger 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>
(08/03/2014 06:58:05 AM)信息这是一条信息
405方法不允许
方法不允许
请求的URL不允许使用该方法

这是我放置“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>
(08/03/2014 07:01:54 AM)信息这是一条信息
404找不到
找不到
在服务器上找不到请求的URL。如果您手动输入URL,请检查拼写并重试


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

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

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

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


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

您能否向我们展示您的路由定义并打印出请求。历史记录?Apache是否会根据URL为请求触发任何形式的重定向,尤其是服务器内部的重定向。内存中存在某些情况,在执行这种重定向时,请求会转换为GET请求。请特别检查您是否在Apache中配置了回退资源。@GrahamDumpleton我希望识别请求遇到的重定向,因为这可能会解释数据丢失的原因。@sigmavirus24检查新的更新please@GrahamDumpleton我们使用的是Dreamhost,一个共享服务器,所以apache配置没有电源。老实说,我不能告诉你我们是否有重定向,但我不这么认为,因为这是唯一一个不起作用的请求。如果你检查我的另一个问题,张贴在第二行,你可以看到我的请求类型显式处理GET和POST,我删除了GET以测试它是否是post请求,而不是。我有一个类似的问题,我甚至尝试发送post并获取python的请求,以查看发生了什么,结果证明我应该使用https而不是http