运行
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'<Todo_v4 {self.id} {self.description}>'
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"会发现有很多不相干的信息,比如错误原因说是字典或者列表的问题。
我搜索了"request.get_json",看到有这么这一种解决方案,可行:https://blog.csdn.net/orangleliu/article/details/80136615
原文提到了两个方案:
- Http 请求增加
Content-Type:application/json
header - 或者 使用
request.get_json(force=True)
忽略mimetype
我的script里面已经增加了
headers:{
'Content-Type':'application/json'
}
所以就试试第二个办法,成功了。没有报错。
所以说,有时候报错信息给出来的错误不只是“字面意思”,也有时候跟调用的命令、函数甚至你的代码逻辑结构有关。
Flask是个坑……漫漫长路。