使用 flask_sqlalchemy 将 HTML 表单中的日期插入到 SQlite 数据库中
Insert Date from HTML form into SQlite database using flask_sqlalchemy
下面有点挣扎。
我有一个简单的 HTML 页面,其中包含 3 个表单、用户、开始日期和结束日期。代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>date picker</title>
</head>
<body>
<h1>Make A Short URL</h1>
<form action="/" method="post">
<label for="name">Enter Your Name</label>
<input type="text" name="name" value="" required>
<label for="date1">Enter date Beginning </label>
<input type="date" name="date1" value="" required>
<label for="date2">Enter date End </label>
<input type="date" name="date2" value="" required>
<input type="submit" value="Submit">
</form>
</body>
</html>
然后我使用 Python Flask 框架将其结果插入数据库。我已经获取了表单的值,并且可以在 python 中正确打印这些值。我面临的问题是,当将这些日期值传递给 SQLalchemy 以将它们插入我的数据库时,它插入不正确。
我使用打印语句跟踪了每个阶段,以查看 HTML 表单中的值是否正确。在将其传递到数据库之前,一切似乎都是正确的。
代码正确执行,没有错误,但是数据被插入到数据库中的多行中?这是有原因的吗?
非常感谢任何意见!
插入后的数据库示例:
Python代码:
from flask import Flask, render_template, url_for, request, redirect
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
class database(db.Model):
id = db.Column(db.Integer, primary_key=True)
user = db.Column(db.String(200))
startdate = db.Column(db.String(10))
enddate = db.Column(db.String(10))
@app.route('/', methods = ['POST','GET'],)
def signup():
if request.method == 'GET':
return render_template('home.html')
elif request.method == 'POST':
name = request.form['name']
print("The name is '" + name + "'")
startdate1 = request.form['date1']
print("The Start date is '" + startdate1 + "'")
enddate1 = request.form['date2']
print("The end date is '" + enddate1 + "'")
dbname = database(user=name)
dbstartdate = database(startdate=startdate1)
print(dbstartdate)
dbenddate = database(enddate=enddate1)
try:
db.session.add(dbname)
db.session.add(dbstartdate)
db.session.add(dbenddate)
db.session.commit()
return redirect('/')
except:
return 'There was an issue adding your task'
return redirect('/')
if __name__ == '__main__':
app.run(debug=True)
问题是您调用了 db.session.add()
三次。这使得三个独立的事务。相反,你想要一个单一的记录插入:
@app.route('/', methods = ['POST','GET'],)
def signup():
if request.method == 'GET':
return render_template('home.html')
elif request.method == 'POST':
name = request.form['name']
print("The name is '" + name + "'")
startdate1 = request.form['date1']
print("The Start date is '" + startdate1 + "'")
enddate1 = request.form['date2']
print("The end date is '" + enddate1 + "'")
record = database(user=name,
startdate=startdate1,
enddate=enddate1)
try:
db.session.add(record)
db.session.commit()
return redirect('/')
except:
return 'There was an issue adding your task'
return redirect('/')
换句话说,您想要一次性创建 database
class 的 一个实例 并具有所有属性。然后将其作为单个完整记录插入,而不是三个实例,每个实例具有一个属性。
注意事项:
视图函数最后的 return redirect('/')
是多余的。您的代码不可能达到这一点(它要么抛出异常,要么不抛出异常,但两条路径都已经有自己的 return
值)
- 使用通用
except
不是好的做法。这实际上会捕获 KeyboardInterrupt
因此可能很难在长时间的任务中停止您的应用程序。即使您不想处理个别异常,也请确保使用 except Exception:
这样您就可以实际中断代码
- 代码中有空格没有坏处。确保使用空行在概念上分隔 functions/classes 等。将所有内容拼凑在一起很难阅读
下面有点挣扎。
我有一个简单的 HTML 页面,其中包含 3 个表单、用户、开始日期和结束日期。代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>date picker</title>
</head>
<body>
<h1>Make A Short URL</h1>
<form action="/" method="post">
<label for="name">Enter Your Name</label>
<input type="text" name="name" value="" required>
<label for="date1">Enter date Beginning </label>
<input type="date" name="date1" value="" required>
<label for="date2">Enter date End </label>
<input type="date" name="date2" value="" required>
<input type="submit" value="Submit">
</form>
</body>
</html>
然后我使用 Python Flask 框架将其结果插入数据库。我已经获取了表单的值,并且可以在 python 中正确打印这些值。我面临的问题是,当将这些日期值传递给 SQLalchemy 以将它们插入我的数据库时,它插入不正确。
我使用打印语句跟踪了每个阶段,以查看 HTML 表单中的值是否正确。在将其传递到数据库之前,一切似乎都是正确的。
代码正确执行,没有错误,但是数据被插入到数据库中的多行中?这是有原因的吗?
非常感谢任何意见!
插入后的数据库示例:
Python代码:
from flask import Flask, render_template, url_for, request, redirect
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
class database(db.Model):
id = db.Column(db.Integer, primary_key=True)
user = db.Column(db.String(200))
startdate = db.Column(db.String(10))
enddate = db.Column(db.String(10))
@app.route('/', methods = ['POST','GET'],)
def signup():
if request.method == 'GET':
return render_template('home.html')
elif request.method == 'POST':
name = request.form['name']
print("The name is '" + name + "'")
startdate1 = request.form['date1']
print("The Start date is '" + startdate1 + "'")
enddate1 = request.form['date2']
print("The end date is '" + enddate1 + "'")
dbname = database(user=name)
dbstartdate = database(startdate=startdate1)
print(dbstartdate)
dbenddate = database(enddate=enddate1)
try:
db.session.add(dbname)
db.session.add(dbstartdate)
db.session.add(dbenddate)
db.session.commit()
return redirect('/')
except:
return 'There was an issue adding your task'
return redirect('/')
if __name__ == '__main__':
app.run(debug=True)
问题是您调用了 db.session.add()
三次。这使得三个独立的事务。相反,你想要一个单一的记录插入:
@app.route('/', methods = ['POST','GET'],)
def signup():
if request.method == 'GET':
return render_template('home.html')
elif request.method == 'POST':
name = request.form['name']
print("The name is '" + name + "'")
startdate1 = request.form['date1']
print("The Start date is '" + startdate1 + "'")
enddate1 = request.form['date2']
print("The end date is '" + enddate1 + "'")
record = database(user=name,
startdate=startdate1,
enddate=enddate1)
try:
db.session.add(record)
db.session.commit()
return redirect('/')
except:
return 'There was an issue adding your task'
return redirect('/')
换句话说,您想要一次性创建 database
class 的 一个实例 并具有所有属性。然后将其作为单个完整记录插入,而不是三个实例,每个实例具有一个属性。
注意事项:
-
视图函数最后的
return redirect('/')
是多余的。您的代码不可能达到这一点(它要么抛出异常,要么不抛出异常,但两条路径都已经有自己的return
值)- 使用通用
except
不是好的做法。这实际上会捕获KeyboardInterrupt
因此可能很难在长时间的任务中停止您的应用程序。即使您不想处理个别异常,也请确保使用except Exception:
这样您就可以实际中断代码 - 代码中有空格没有坏处。确保使用空行在概念上分隔 functions/classes 等。将所有内容拼凑在一起很难阅读