Flask 应用程序从 curl 工作,而不是从请求工作

Flask app working from curl, not from requests

下面是一些休息的代码api我正在处理。我从找到的教程 here 中获得了这个。它正在运行,并使用以下 curl 命令最终将添加一个部落。

curl -H "Content-Type: application/json" -X POST -d '{"data":[ {"group" : "Read a book"}] }' http://localhost:5000/group_es/api/v1.0/group

下面是 Flask 应用程序本身的代码。

from flask import Flask, jsonify, abort, make_response, request

app = Flask(__name__)

groups = [
    {
        'id': 1,
        'title': u'Buy groceries',
        'description': u'Milk, Cheese, Pizza, Fruit, Tylenol', 
        'done': False
    },
    {
        'id': 2,
        'title': u'Learn Python',
        'description': u'Need to find a good Python tutorial on the web', 
        'done': False
    }
]

@app.route('/group_es/api/v1.0/group', methods=['GET'])
def get_tribes():
    return jsonify({'group': groups})

@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)

@app.route('/group_es/api/v1.0/group', methods=['POST'])
def create_group():
    if not request.json or not 'data' in request.json:
        abort(400)
    groups = request.json['data']

    return jsonify({'group': groups}), 20

@app.route('/group_es/api/v1.0/group', methods=['PUT'])
def update_group():
    print 'REQUEST', request.json

    groups = request.json['data']

    return jsonify({'group': groups}), 20

无论如何,我尝试使用请求库将 curl 命令转换为 python 请求:

import json
from requests import put, post, request

headers = {'content-type': 'application/json'}

In[6]: put('http://localhost:5000/group_es/api/v1.0/group', params={'data': [{'adam':'name'}] }, headers=headers)

Out[6]: <Response [400]>

但是,如您所见,它失败了。我不知道这是否是由于 flask 库本身造成的,也不是由于不正确的请求命令导致的 in-sync with curl.

我还尝试将 headers 作为字典传递并使用 json

转储数据
resp = put('http://localhost:5000/tribe_es/api/v1.0/tribe', data=json.dumps({'data':'adam'}),headers={'content-type':'application/json'})

这会导致错误,这是我以前从未见过的:

ConnectionError: ('Connection aborted.', BadStatusLine('HTTP/1.0 20 UNKNOWN\r\n',))

如果有人可以帮助解释为什么 requests 不工作,但 curl 工作正常,那就太好了!

您没有在此处发送 JSON:

put('http://localhost:5000/group_es/api/v1.0/group', params={'data': [{'adam':'name'}] }, headers=headers)

params 会将数据编码为 x-www-url-encoded 数据。请改用 json 关键字; Content-Type header 将相应调整,因此您无需手动设置 header:

put('http://localhost:5000/group_es/api/v1.0/group', json={'data': [{'adam':'name'}] })

您的 curl 命令行使用了 POST,而不是 PUT,但您的 PUT 处理程序也已损坏。状态实际上意味着您的代码 有效 ,但您的 PUT 处理程序 returns 状态 20,而不是 200:

return jsonify({'group': groups}), 20

删除, 20; 200 是返回的默认状态代码。或者像教程中那样使用 201;意思是 Created 而不是 Ok:

return jsonify({'group': groups}), 201

如果您改用 post(),您会发现 data=json.dumps() 方法工作正常。如果您将 -X PUT 与 curl 一起使用,您可能会发现状态代码存在同样的问题。