Вы не отправляете данные JSON на /books
маршрут, используя метод POST.
Я попробовал ваше решение с почтальоном, и оно сработало.Кроме того, если вы хотите использовать какой-либо маршрут для GET и POST, не разделяйте их.Используйте methods=['GET', 'POST']
.Вот ваш код, переформатированный в соответствии со стандартом PEP 8:
from flask import Flask, jsonify, request
app = Flask(__name__)
books = [
{'name': 'M',
'price': 6.75,
'isbn': 123
},
{'name': 'G',
'price': 7.75,
'isbn': 456
}
]
# POST /books
# {
# "name": "F",
# "price": 7.00,
# "isbn": 789
# }
def valid_book_object(book):
if "isbn" in book and "name" in book and "price" in book:
return True
else:
return False
@app.route('/books', methods=['GET', 'POST'])
def add_book():
# If request is GET, just return JSON data of books.
if request.method == 'GET':
return jsonify({'books': books})
else:
# This is part if it is POST request
request_data = request.get_json()
if valid_book_object(request_data):
books.insert(0, request_data)
return "True"
else:
return "False"
# GET /books/456
@app.route('/books/<int:isbn>') # second endpoint
def get_book_by_isbn(isbn):
return_value = {}
for book in books:
if book["isbn"] == isbn:
return_value = {
'name': book["name"],
'price': book["price"]
}
return jsonify(return_value)
return 'No book with {} isbn value'.format(isbn)
if __name__ == '__main__':
app.run(port=5000)
А вот вывод почтальона (вы можете увидеть True внизу, это то, что вы вернете, если POST был успешным):
Если вы используете почтальона, обязательно выберите application/json
content-type.
Если вы используете JQueryajax
метод, пожалуйста, прочитайте этот ответ .Но в любом случае, здесь используется JQuery (проверено):
data = JSON.stringify({
name: "F",
price: 7.00,
isbn: 789
});
$.ajax({
url: '/books',
type: "POST",
data: data,
contentType: "application/json",
dataType: "json",
success: function(){
console.log('Post executed successfully');
}
})