使用带有Flask的Python requests.put()时的奇怪行为

时间:2015-11-27 21:56:23

标签: flask python-requests

背景
我有一个服务A可以访问HTTP请求。我还有其他想要调用这些API的服务。

问题
当我使用POSTMAN测试服务A的API时,每个请求都可以正常工作。但是当我使用python的请求库来发出这些请求时,有一个一个 PUT方法就行不通了。由于某种原因,被调用的PUT方法根本无法接收数据(HTTP主体),尽管它可以接收标头。另一方面,以相同方式调用的POST方法可以完美地接收数据。

我设法通过使用httplib库来实现我的目标,但我仍然对这里发生的事情感到困惑。

犯罪现场
路线1:

@app.route("/private/serviceA", methods = ['POST'])
@app.route("/private/serviceA/", methods = ['POST'])
def A_create():
    # request.data contains correct data that can be read with request.get_json()

路线2:

@app.route("/private/serviceA/<id>", methods = ['PUT'])
@app.route("/private/serviceA/<id>/", methods = ['PUT'])
def A_update(id):
    # request.data is empty, though request.headers contains headers I passed in
    # This happens when sending the request with Python requests library, but not when sending with httplib library or with POSTMAN
    # Also, data comes in fine when all other routes are commented out
    # Unless all other routes are commented out, this happens even when the function body has only one line printing request.data

路线3:

@app.route("/private/serviceA/schema", methods = ['PUT'])
def schema_update_column():
    # This one again works perfectly fine

使用POSTMAN: enter image description here enter image description here

使用来自其他服务的请求库:

@app.route("/public/serviceA/<id>", methods = ['PUT'])
def A_update(id):
    content = request.get_json()
    headers = {'content-type': 'application/json'}
    response = requests.put('%s:%s' % (router_config.HOST, serviceA_instance_id) + '/private/serviceA/' + str(id), data=json.dumps(content), headers = headers)
    return Response(response.content, mimetype='application/json', status=response.status_code)

使用其他服务的httplib库:

@app.route('/public/serviceA/<id>', methods=['PUT'])
def update_course(id):
    content= request.get_json()
    headers = {'content-type': 'application/json'}
    conn = httplib.HTTPConnection('%s:%s' % (router_config.HOST, serviceA_instance_id))
    conn.request("PUT", "/private/serviceA/%s/" % id, json.dumps(content), headers)
    return str(conn.getresponse().read())

问题
1.我在路线2上做错了什么? 2.对于路由2,当 处理程序被注释掉时,似乎没有执行处理程序,这也让我感到困惑。我不知道Flask有什么重要的东西吗?

代码回购
以防一些不错的人有兴趣看看凌乱的无证代码...
https://github.com/fantastic4ever/project1
serviceA对应于课程服务(course_flask.py),调用它的服务对应于路由器服务(router.py)。
仍在使用请求库的版本是747e69a11ed746c9e8400a8c1e86048322f4ec39。

1 个答案:

答案 0 :(得分:0)

在您使用请求库时,您正在使用requests.post,它正在发送POST请求。如果您使用requests.put,则会发送PUT个请求。这可能是个问题。

Request documentation