Python 3.x 烧瓶类型错误:参数类型为';非类型';这是不可容忍的

Python 3.x 烧瓶类型错误:参数类型为';非类型';这是不可容忍的,python-3.x,pycharm,flask-restful,Python 3.x,Pycharm,Flask Restful,我不确定为什么会出现这种类型错误: 文件“C:/Users/PycharmProjects/REST/app.py”,第30行,在 有效的\u书籍\u对象 如果(书中的“isbn”和书中的“名称”以及书中的“价格”): TypeError:类型为“NoneType”的参数不可编辑 127.0.0.1---[12/Nov/2018 14:22:29]“POST/books HTTP/1.1”500- 代码: 从烧瓶导入烧瓶,jsonify,请求 从测试导入* app=烧瓶(名称) 书=[ {'na

我不确定为什么会出现这种类型错误:

文件“C:/Users/PycharmProjects/REST/app.py”,第30行,在 有效的\u书籍\u对象 如果(书中的“isbn”和书中的“名称”以及书中的“价格”): TypeError:类型为“NoneType”的参数不可编辑 127.0.0.1---[12/Nov/2018 14:22:29]“POST/books HTTP/1.1”500-

代码:

从烧瓶导入烧瓶,jsonify,请求
从测试导入*
app=烧瓶(名称)
书=[
{'name':'M',
“价格”:6.75,
“isbn”:123
},
{'name':'G',
“价格”:7.75,
“isbn”:456
},
]
#获取/存储
@app.route('/books')#第一个端点
def get_books():
返回jsonify({'books':books})
#邮递/书籍
#{'name':'F',
#“价格”:7.00,
#“isbn”:789
#},
定义有效的书籍对象(书籍):
如果(书中的“isbn”和书中的“名称”以及书中的“价格”):
返回真值
打印(“真实”)
其他:
返回错误
打印(“假”)
@app.route('/books',methods=['POST'])
def add_book():
#返回jsonify(request.get_json())
request\u data=request.get\u json()
如果(有效的图书对象(请求数据)):
书籍。插入(0,请求\u数据)
返回“True”
其他:
返回“False”
#GET/books/456
@app.route('/books/')#第二个端点
def通过isbn获取图书(isbn):
返回值={}
对于书本中的书本:
如果图书[“isbn”]==isbn:
返回值={
“名称”:书本[“名称”],
“价格”:书[“价格”]
}
返回jsonify(返回值)
应用程序运行(端口=5000)

您没有使用POST方法将JSON数据发送到
/books
路由

我和邮递员试过你的解决方案,它成功了。另外,如果你想使用一些路径来获取和发布,不要拆分它们。使用
方法=['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)

book
似乎具有值
None
。因此,当您尝试在book中执行
“isbn”时,
book
被假定为一个iterable,但相反,它被发现为
None
,这不是iterable。这就是错误消息所说的。必须定义book类吗??books在代码中用作参数。它与是否拥有类无关。它与变量
book
可以接受且未在代码中处理的值(
None
)相关。发生错误时,是否检查了
request\u data
是否为空json文件。
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)
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');
  }
})