我遇到了以下错误:
File "/home/sandbox/.local/lib/python3.6/site-packages/sqlalchemy/sql/sqltypes.py", line 1973, in _strict_as_bool
raise TypeError("Not a boolean value: %r" % (value,))
sqlalchemy.exc.StatementError: (builtins.TypeError) Not a boolean value: 'True'
[SQL: INSERT INTO projects (status) VALUES (?)]
[parameters: [{'status': 'True'}]]
127.0.0.1 - - [12/May/2022 21:53:22] "POST / HTTP/1.1" 500 -
我试着作为布尔输入,在我的主路径上输入从0\1、False_True、False_True的所有内容。我还试着在引号之间插入布尔值。我做错了什么?
import os
from flask import Flask
from flask import render_template
from flask import request
from flask import redirect
from flask_sqlalchemy import SQLAlchemy
database_file = "sqlite:///DATA/DATA.db"
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = database_file
db = SQLAlchemy(app)
class Projects(db.Model):
__tablename__="projects"
status = db.Column(db.Boolean, default=False, nullable=False, primary_key=True)
def __repr__(self):
return f"projects('{self.status}')"
db.create_all()
@app.route("/", methods=["GET", "POST"])
def home():
if request.form:
status = Projects(status=request.form.get("status"))
db.session.add(status)
db.session.commit()
return render_template("home.html")
我的基本路线如下
{% extends "layout.html" %}
{% block body %}
<h1> Add new project </h1>
<form method="POST" action="/">
<select name="status" placeholder="Project Status">
<option value=False> Not Active </option>
<option value=True> Active </option>
</select>
<input type="submit" value="Register Data">
</form>
{% endblock %}
发布于 2022-05-12 20:31:57
您遇到的问题是,表单提交将选择值返回为字符串(字面意思是"True"
或"False"
),而SQL驱动程序则要求使用布尔类型。
有一个函数distutils.util.strtobool,它可以安全地将真值或假值的表示转换为布尔类型,如果有人在API中添加了一些顽皮的东西,就会引发ValueError (这比使用eval()
哪个不应该在不受信任的输入上使用要好得多)。
我将更新您的路线如下:
# At the top
from distutils.util import strtobool
@app.route("/", methods=["GET", "POST"])
def home():
if request.form:
try:
form_status = strtobool(request.form.get("status").lower())
status = Projects(status=form_status)
db.session.add(status)
db.session.commit()
except ValueError:
# Handle the error - e.g. flash a message to the user
flash("Invalid input")
return render_template("home.html")
strtobool
需要注意的一点是,从Python3.10开始,distutils
就不再受欢迎了,并将在3.12中删除。这个答案将它的实现显示为一个函数,这非常简单,因此在您自己的实用程序函数中包含任何期望超过Python3.12的代码都是值得的。
https://stackoverflow.com/questions/72221515
复制相似问题