POST-запрос с Flask Restful приводит к TypeError - PullRequest
1 голос
/ 10 марта 2020
from flask import Flask, request
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

items = []

class Item(Resource):

    def post(self, name):
        data = request.get_json()
        item = {'name': name, 'price': data['price']}
        items.append(item)
        return item

api.add_resource(Item, "/item/<string:name>")


app.run(port=5000, debug=True)

Это мой код. Пытаясь сделать почтовый запрос с почтальоном:

http://127.0.0.1:5000/item/chair

Это тело:

{
    "price": 15.99
}

При выполнении почтового запроса я получаю следующую ошибку:

TypeError: объект 'NoneType' не может быть подписан

Почему мои данные приводят к этому? Кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Убедитесь, что заголовок Content-Type вашего запроса настроен на application/json. Flask метод Request.get_json() вернет None, если Content-Type вашего mimetype запроса не указывает JSON.

См. Документы Почтальона по настройке заголовков запросов .

1 голос
/ 10 марта 2020

Ваша проблема в том, что ваш запрос POST неправильно заполняет свои заголовки. Быстрый тест с CURL демонстрирует это:

vagrant@vagrant:~$ curl -d '{"price":15.99}' -H "Content-Type: application/json" -X POST http://localhost:5000/item/chair
{
    "name": "chair",
    "price": 15.99
}
vagrant@vagrant:~$ curl -d '{"price":15.99}' -X POST http://localhost:5000/item/chair
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>TypeError: 'NoneType' object has no attribute '__getitem__' // Werkzeug Debugger</title>
    <link rel="stylesheet" href="?__debugger__=yes&amp;cmd=resource&amp;f=style.css"
        type="text/css">
    <!-- We need to make sure this has a favicon so that the debugger does
         not by accident trigger a request to /favicon.ico which might
         change the application state. -->
    <link rel="shortcut icon"
        href="?__debugger__=yes&amp;cmd=resource&amp;f=console.png">
    <script src="?__debugger__=yes&amp;cmd=resource&amp;f=jquery.js"></script>
    <script src="?__debugger__=yes&amp;cmd=resource&amp;f=debugger.js"></script>
    <script type="text/javascript">
      var TRACEBACK = 140264881526352,
          CONSOLE_MODE = false,
...

Я вырезал остальную часть HTML для краткости. Нет ничего плохого в вашем коде; вам нужно указать заголовок `Content-Type: application / json" при отправке запроса почтальона.

...