【问题标题】:Flask TypeError: argument of type 'NoneType' is not iterableFlask TypeError:“NoneType”类型的参数不可迭代
【发布时间】:2019-04-15 14:47:03
【问题描述】:

我不确定为什么会收到此类型错误:

文件“C:/Users/PycharmProjects/REST/app.py”,第 30 行,在 有效书籍对象 if(书中的“isbn”和书中的“name”和书中的“price”): TypeError:“NoneType”类型的参数不可迭代 127.0.0.1 - - [2018 年 11 月 12 日 14:22:29]“POST /books HTTP/1.1”500 -

代码:

from flask import Flask, jsonify, request
from test import *
app=Flask(__name__)

books=[
    {'name': 'M',
     'price': 6.75,
    'isbn':123
    },
    {'name': 'G',
     'price': 7.75,
    'isbn':456
    },

]


#GET /store
@app.route('/books')  #first endpoint
def get_books():
    return jsonify({'books': books})

# 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
         print("true")
    else:
        return False
        print("false")


@app.route('/books', methods=['POST'])
def add_book():
    #return jsonify(request.get_json())
     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)



app.run(port=5000)

【问题讨论】:

  • book 似乎有 None 的值。因此,当您尝试执行 "isbn" in book 时,book 被认为是可迭代的,但实际上却是 None,这不是可迭代的。这就是错误消息的内容。
  • 书籍类是不是必须要定义?? book 在代码中用作参数。
  • 跟有没有上课没有关系。它与变量 book 可以采用的值 (None) 相关,并且未在代码中处理。报错时检查request_data是否为空json文件。

标签: python-3.x pycharm flask-restful


【解决方案1】:

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

我用邮递员尝试了你的解决方案,它奏效了。此外,如果您想为 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。

如果您使用的是 JQuery ajax 方法,请阅读此answer。但无论如何,这里使用的是 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');
  }
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多