代码之家  ›  专栏  ›  技术社区  ›  user366312

无法将数据插入SQLite表

  •  1
  • user366312  · 技术社区  · 3 年前

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

    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:\ProgramData\Miniconda3\python.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:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1719, in _execute_context
        context = constructor(
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\engine\default.py", line 1072, in _init_compiled
        param = [
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\engine\default.py", line 1073, in <listcomp>
        processors[key](compiled_params[key])
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\dialects\sqlite\base.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:\git\funkclusterfrontend\bootstrap_table.py", line 46, in index
        db.session.commit()
      File "<string>", line 2, in commit
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\orm\session.py", line 1451, in commit
        self._transaction.commit(_to_root=self.future)
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\orm\session.py", line 829, in commit
        self._prepare_impl()
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\orm\session.py", line 808, in _prepare_impl
        self.session.flush()
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\orm\session.py", line 3383, in flush
        self._flush(objects)
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\orm\session.py", line 3523, in _flush
        transaction.rollback(_capture_exception=True)
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\util\langhelpers.py", line 70, in __exit__
        compat.raise_(
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\util\compat.py", line 208, in raise_
        raise exception
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\orm\session.py", line 3483, in _flush
        flush_context.execute()
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 456, in execute
        rec.execute(self)
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 630, in execute
        util.preloaded.orm_persistence.save_obj(
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\orm\persistence.py", line 245, in save_obj
        _emit_insert_statements(
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\orm\persistence.py", line 1238, in _emit_insert_statements
        result = connection._execute_20(
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1631, in _execute_20
        return meth(self, args_10style, kwargs_10style, execution_options)
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\sql\elements.py", line 332, in _execute_on_connection
        return connection._execute_clauseelement(
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1498, in _execute_clauseelement
        ret = self._execute_context(
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1725, in _execute_context
        self._handle_dbapi_exception(
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\engine\base.py", line 2043, in _handle_dbapi_exception
        util.raise_(
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\util\compat.py", line 208, in raise_
        raise exception
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1719, in _execute_context
        context = constructor(
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\engine\default.py", line 1072, in _init_compiled
        param = [
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\engine\default.py", line 1073, in <listcomp>
        processors[key](compiled_params[key])
      File "C:\ProgramData\Miniconda3\lib\site-packages\sqlalchemy\dialects\sqlite\base.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 -
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   tehCheat    3 年前

    你需要 allow the POST method 在您的端点上。默认情况下,端点允许 GET 只有

    尝试更改 @app.route('/') @app.route('/', methods = ['POST', 'GET']) .

    编辑:

    还有一个问题,“TypeError:SQLite DateTime类型只接受Python日期时间和日期对象作为输入。” created_at_time = datetime.utcnow ,即设置变量 created_at_time 到函数 datetime.utcnow 而不是该函数返回的值: datetime.utcnow() 根据 the docs datetime.now() 优先于 datetime.ucnow() .