TypeError: NoneType object is not subscriptable 方案解决

运行

FLASK_APP=app.py FLASK_DEBUG=true flask run

出现了报错。

'''
在app_v3.py的版本上进行改变    
'''
from flask import Flask, render_template, request, redirect,url_for,jsonify
from flask_sqlalchemy import SQLAlchemy
#原本报错,以下来自stackoverflow的解答https://stackoverflow.com/questions/58740043/how-do-i-catch-a-psycopg2-errors-uniqueviolation-error-in-a-python-flask-app
from sqlalchemy import create_engine,Column, Integer, String
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from psycopg2.errors import UniqueViolation

app_v4 = Flask(__name__,template_folder='templates')  #这里的名字一定要跟文件名名字一致
app_v4.config['SQLALCHEMY_DATABASE_URI']= 'postgres+psycopg2://postgres:1234@localhost:5432/todoapp'
db_v4 = SQLAlchemy(app_v4)

class Todo_v4(db_v4.Model):
    __tablename__='todos4'
    id = db_v4.Column(db_v4.Integer,primary_key=True)
    description = db_v4.Column(db_v4.String(),nullable=False)

    def __repr__(self):
        return f''

db_v4.create_all()

@app_v4.route('/todos4/create', methods=['POST'])

def create_todo():
    description = request.get_json()['description']   #由form.get('description', '')变成getjson
    todo = Todo_v4(description=description)
    db_v4.session.add(todo)
    db_v4.session.commit()
    return jsonify ({
        'description':todo.description
    })      # return redirect(url_for('index_v4'))变成return jsonify


@app_v4.route('/')   #这里也要跟文件名保持一致,否则会报错

def index_v4():
    return render_template('index_v4.html',data=Todo_v4.query.all())

TypeError: NoneType object is not subscriptable 方案解决_第1张图片

如果只搜索"TypeError:'NoneType' object is not subscriptable"会发现有很多不相干的信息,比如错误原因说是字典或者列表的问题。

我搜索了"request.get_json",看到有这么这一种解决方案,可行:https://blog.csdn.net/orangleliu/article/details/80136615

原文提到了两个方案:

  1. Http 请求增加 Content-Type:application/json header
  2. 或者 使用 request.get_json(force=True) 忽略mimetype

我的script里面已经增加了

headers:{
    'Content-Type':'application/json'
}

所以就试试第二个办法,成功了。没有报错。

TypeError: NoneType object is not subscriptable 方案解决_第2张图片

所以说,有时候报错信息给出来的错误不只是“字面意思”,也有时候跟调用的命令、函数甚至你的代码逻辑结构有关。

Flask是个坑……漫漫长路。

你可能感兴趣的:(python)