【问题标题】:NoneType Object is not subscriptable (Flask, Python, SQLAlchemy) [duplicate]NoneType 对象不可下标(Flask,Python,SQLAlchemy)[重复]
【发布时间】:2021-09-17 15:45:35
【问题描述】:

我知道这似乎是一个愚蠢的问题,但我挖了又挖,找不到任何似乎可以解决问题的答案。

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import os

app = Flask(__name__)

basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'app.sqlite')
db = SQLAlchemy(app)
ma = Marshmallow(app)

class Guide(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), unique=False)
    content = db.Column(db.String(144), unique=False)

    def __init__(self, title, content):
        self.title = title
        self.content = content


class GuideSchema(ma.Schema):
    class Meta:
        fields = ('title', 'content')


guide_schema = GuideSchema()
guides_schema = GuideSchema(many=True)

# Endpoint to create a new guide
@app.route('/guide', methods=["POST"])
def add_guide():
    title = request.json['title']
    content = request.json['content']

    new_guide = Guide(title, content)

    db.session.add(new_guide)
    db.session.commit()

    guide = Guide.query.get(new_guide.id)

    return guide_schema.jsonify(guide)


# endpoint to query all guides
@app.route('/guides', methods=["GET"])
def get_guides():
    all_guides = Guide.query.all()
    result = guides_schema.dump(all_guides)
    return jsonify(result.data)


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


完整追溯:

Traceback (most recent call last):
  File "/Users/bmoney/Documents/python_projects/flask-practice/venv/lib/python3.9/site-packages/flask/app.py", line 2088, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/bmoney/Documents/python_projects/flask-practice/venv/lib/python3.9/site-packages/flask/app.py", line 2073, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/bmoney/Documents/python_projects/flask-practice/venv/lib/python3.9/site-packages/flask/app.py", line 2070, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/bmoney/Documents/python_projects/flask-practice/venv/lib/python3.9/site-packages/flask/app.py", line 1515, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/bmoney/Documents/python_projects/flask-practice/venv/lib/python3.9/site-packages/flask/app.py", line 1513, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/bmoney/Documents/python_projects/flask-practice/venv/lib/python3.9/site-packages/flask/app.py", line 1499, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "/Users/bmoney/Documents/python_projects/flask-practice/app.py", line 34, in add_guide
    title = request.json['title']
TypeError: 'NoneType' object is not subscriptable

我知道在这种情况下 None 是不可迭代的,但我看不出什么会运行 NoneType 错误。

对于这些信息的价值,我正在通过 Postman 在正确的本地主机上运行 GET 和 POST 请求。

提前谢谢你,我真的很感谢这个社区!

【问题讨论】:

  • 你能edit 并粘贴完整的回溯错误。并尝试使用request.form['title']request.form['content']
  • 对不起!我将request.json 更改为request.form,但似乎没有成功:/

标签: python-3.x api flask sqlalchemy postman


【解决方案1】:

当 Flask 服务器没有接收任何 JSON 数据或任何 Content-Type 为 application/json 的请求时,request.json 为 None。

要解决此问题,请确保您的客户端(如果您使用 JS 或 Postman)在标头中使用 application/json 作为 Content-Type,并且它应该具有 JSON 有效负载。

看看这个,我希望你会发现如何让你的客户端在请求中发送 JSON 负载:Fetch: POST JSON data

【讨论】:

  • 通常情况下,我可以在标题中看到Content-Type,但它看起来并不存在。为什么不填充,如果我能看到Content-Length,尽管长度设置为 0。
  • @BrysonFulton 如果是这种情况,那么您应该在 JS POST 请求中任意设置 Content-Type。确保它是application/json
猜你喜欢
  • 2021-02-14
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2017-03-11
  • 2015-02-27
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多