无法向SQLite表中插入数据



下面的源代码给了我一个错误:

405 Method not allowed

当我按[提交]按钮时。

  1. 为什么会这样?
  2. 我该如何修复它?

app.py

from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import secrets
import string
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///filename.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

def get_random_string():
return ''.join(secrets.choice(string.ascii_uppercase + string.ascii_lowercase) for i in range(7))

class job_queue(db.Model):
job_id = db.Column(db.Integer, primary_key=True)
unique_job_key = db.Column(db.String(64), index=True)
user_name = db.Column(db.Integer, index=True)
input_string = db.Column(db.String(256))
is_done = db.Column(db.Boolean)
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
db.create_all()

@app.route('/')
def index():
if request.method == 'POST':
unique_job_key_str = get_random_string()
user_name1 = request.form['user_name1']
text1 = request.form['text1']
is_done_bool = 0
created_at_time = datetime.utcnow
new_job = job_queue(unique_job_key=unique_job_key_str,
user_name=user_name1,
input_string=text1,
is_done=is_done_bool,
created_at=created_at_time)
try:
db.session.add(new_job)
db.session.commit()
return redirect('/')
except:
return "There was a problem adding new job!"
# end try
else:
users = job_queue.query.order_by(job_queue.created_at).all()
return render_template('bootstrap_table.html', title='Jobs', users=users)
# end if

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

bootstrap_table.html

{% extends "base.html" %}
{% block content %}
<div>
<form method="POST">
<table id="input_panel1" class="table table-striped">
<tr>
<td>Username:</td>
<td><input name="user_name1"></td>
</tr>
<tr>
<td>Input:</td><td> <textarea name="text1" cols="40" rows="5" ></textarea></td>
</tr>
<tr>
<td>Submit: </td><td><input type="submit"></td>
</tr>
</table>
</form>
</div>
<hr>
<table id="data" class="table table-striped">
<thead>
<tr>
<th>Job ID</th>
<th>Job Key</th>
<th>User</th>
<th>Input String</th>
<th>Is Done?</th>
</tr>
</thead>
<tbody>
{% for job_queue in users %}
<tr>
<td>{{ job_queue.job_id }}</td>
<td>{{ job_queue.unique_job_key }}</td>
<td>{{ job_queue.user_name }}</td>
<td>{{ job_queue.input_string }}</td>
<td>{{ job_queue.is_done }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

编辑:堆栈跟踪:

C:ProgramDataMiniconda3python.exe C:/git/funkclusterfrontend/bootstrap_table.py
* Serving Flask app 'bootstrap_table' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 100-569-534
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [31/Dec/2022 22:37:19] "GET / HTTP/1.1" 200 -
ERROR:root:SQLite insertion error!
Traceback (most recent call last):
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyenginebase.py", line 1719, in _execute_context
context = constructor(
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyenginedefault.py", line 1072, in _init_compiled
param = [
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyenginedefault.py", line 1073, in <listcomp>
processors[key](compiled_params[key])
File "C:ProgramDataMiniconda3libsite-packagessqlalchemydialectssqlitebase.py", line 1003, in process
raise TypeError(
TypeError: SQLite DateTime type only accepts Python datetime and date objects as input.
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:gitfunkclusterfrontendbootstrap_table.py", line 46, in index
db.session.commit()
File "<string>", line 2, in commit
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyormsession.py", line 1451, in commit
self._transaction.commit(_to_root=self.future)
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyormsession.py", line 829, in commit
self._prepare_impl()
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyormsession.py", line 808, in _prepare_impl
self.session.flush()
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyormsession.py", line 3383, in flush
self._flush(objects)
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyormsession.py", line 3523, in _flush
transaction.rollback(_capture_exception=True)
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyutillanghelpers.py", line 70, in __exit__
compat.raise_(
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyutilcompat.py", line 208, in raise_
raise exception
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyormsession.py", line 3483, in _flush
flush_context.execute()
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyormunitofwork.py", line 456, in execute
rec.execute(self)
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyormunitofwork.py", line 630, in execute
util.preloaded.orm_persistence.save_obj(
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyormpersistence.py", line 245, in save_obj
_emit_insert_statements(
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyormpersistence.py", line 1238, in _emit_insert_statements
result = connection._execute_20(
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyenginebase.py", line 1631, in _execute_20
return meth(self, args_10style, kwargs_10style, execution_options)
File "C:ProgramDataMiniconda3libsite-packagessqlalchemysqlelements.py", line 332, in _execute_on_connection
return connection._execute_clauseelement(
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyenginebase.py", line 1498, in _execute_clauseelement
ret = self._execute_context(
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyenginebase.py", line 1725, in _execute_context
self._handle_dbapi_exception(
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyenginebase.py", line 2043, in _handle_dbapi_exception
util.raise_(
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyutilcompat.py", line 208, in raise_
raise exception
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyenginebase.py", line 1719, in _execute_context
context = constructor(
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyenginedefault.py", line 1072, in _init_compiled
param = [
File "C:ProgramDataMiniconda3libsite-packagessqlalchemyenginedefault.py", line 1073, in <listcomp>
processors[key](compiled_params[key])
File "C:ProgramDataMiniconda3libsite-packagessqlalchemydialectssqlitebase.py", line 1003, in process
raise TypeError(
sqlalchemy.exc.StatementError: (builtins.TypeError) SQLite DateTime type only accepts Python datetime and date objects as input.
[SQL: INSERT INTO job_queue (unique_job_key, user_name, input_string, is_done, created_at) VALUES (?, ?, ?, ?, ?)]
[parameters: [{'is_done': 0, 'created_at': <built-in method utcnow of type object at 0x00007FFCB1E11650>, 'user_name': 'user_name1', 'input_string': 'SasASas', 'unique_job_key': 'cwyRgim'}]]
127.0.0.1 - - [31/Dec/2022 22:37:25] "POST / HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [31/Dec/2022 22:37:25] "POST / HTTP/1.1" 200 -

您需要允许在端点上使用POST方法。默认情况下,终端只允许GET

Try change@app.route('/')to@app.route('/', methods = ['POST', 'GET']).

编辑:

还有一个问题,TypeError: SQLite DateTime类型只接受Python的DateTime和date对象作为输入。由created_at_time = datetime.utcnow引起,即将变量created_at_time设置为函数datetime.utcnow,而不是该函数返回的值:datetime.utcnow()。根据文档datetime.now()优先于datetime.utcnow()

最新更新