2017-03-23 35 views
-1

我正在學習如何使用Python中的Flask設計REST API。它位於在這裏:​​難以置信的類型:'dict'Flask應用程序

https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask

一切順利,直到POST段。我精確地追蹤了一切,但是我一直在從return「jsonify {'task',task})」得到一個TypeError「不可用的類型:'dict'」。我查看了示例代碼和我自己的幾十次,並沒有看到任何區別。下面是我有:

@app.route('/todo/api/v1.0/tasks', methods=['POST']) 
def create_task(): 
     if not request.json or not 'title' in request.json: 
       abort(400) 
     task = { 
       'id': tasks[-1]['id'] + 1, 
       'title': request.json['title'], 
       'description': request.json.get('description', ""), 
       'done': False 
     } 
     tasks.append(task) 
     return jsonify({'task', task}), 201 

鑑於本教程是4歲,已在東西這個時候,讓某種原因失效的例子改變。我在Python 2.7.3中運行它。

如需進一步而言,這裏是我完整的腳本:

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

app = Flask(__name__) 

tasks = [ 
     { 
       '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.errorhandler(404) 
def not_found(error): 
     return make_response(jsonify({'error': 'Not found'}), 404) 

@app.errorhandler(400) 
def bad_request(error): 
     return make_response(jsonify({'error': 'Bad request'}), 400) 

@app.route('/todo/api/v1.0/tasks', methods=['GET']) 
def get_tasks(): 
     return jsonify({'tasks': tasks}) 

@app.route('/todo/api/v1.0/tasks/<int:task_id>', methods=['GET']) 
def get_task(task_id): 
     task = [task for task in tasks if task['id'] == task_id] 
     if len(task) == 0: 
       abort(404) 
     return jsonify({'task': task[0]}) 

@app.route('/todo/api/v1.0/tasks', methods=['POST']) 
def create_task(): 
     if not request.json or not 'title' in request.json: 
       abort(400) 
     task = { 
       'id': tasks[-1]['id'] + 1, 
       'title': request.json['title'], 
       'description': request.json.get('description', ""), 
       'done': False 
     } 
     tasks.append(task) 
     return jsonify({'task', task}), 201 

if __name__ == '__main__': 
     app.run(host='0.0.0.0', debug=True) 

謝謝。

+3

'{ '任務',任務}'=>'{ '任務':任務}'你的代碼試圖創建一個包含字符串「任務」和字典「任務」的集合,字典不可散列 –

回答

1

由於帕維爾Kordowski上面提到的,你想返回字典不是一套:

return jsonify({'task': task}), 201 
+1

非常感謝,我不知道在長時間注視代碼之後我是如何忽略了這個錯字。 – user2421173