【问题标题】:How do you force Flask to query database on each GET request?你如何强制 Flask 在每个 GET 请求上查询数据库?
【发布时间】:2019-07-09 13:05:35
【问题描述】:

我有一段非常简单的代码:

@app.route('/read')
def db_read():
    dbcursor.execute('SELECT * FROM books;')
    result = dbcursor.fetchall()
    return render_template('read.html', result=result)

当我启动服务器时,一切正常,但是,如果我在应用程序运行时对数据库进行更改,则更改不会反映在 /read 页面上,必须重新启动应用程序才能反映它们。 我希望每次刷新页面时代码都会查询数据库,而当前的行为对我来说似乎非常违反直觉。有人可以帮忙吗?

【问题讨论】:

  • 您可能在应用启动时初始化dbcursor 一次,您每次都必须在视图代码中初始化它
  • @AmineMessaoudi 抱歉,似乎没有什么不同
  • 那么请把你初始化数据库并运行服务器的代码贴出来,这样我们就可以找出问题出在哪里
  • 您是如何按照 Amine 的建议在视图代码中初始化光标的?
  • @AmineMessaoudi 这是代码的完整版本:pastebin.com/LCNDe4BX

标签: python mysql flask


【解决方案1】:

您是否尝试在配置中将 TEMPLATES_AUTO_RELOAD 设置为 true?当您在调试模式下运行时,它应该切换为 ON,但似乎重新加载模板总是有点问题。

您还应该使用 flask run --debug 命令。 app.run 有 run 命令可以处理的问题。

【讨论】:

    【解决方案2】:

    您的光标在应用实例中初始化,因此执行的查询以只读方式保存到实例中,因此反映到数据库的更改在实例中是持久的。

    有几种解决方法可以解决这个问题。

    我建议您为数据库实例创建单独的模块并在需要的地方导入。

    database.py

    mydb = mysql.connector.connect(
        host=cfg['host'],
        user=cfg['user'],
        passwd=cfg['password'],
        database=cfg['database']
    )
    
    db = mydb.cursor()
    

    app.py

    from database import db
    
    @app.route('/read') 
        def db_read():
            db.execute('SELECT * FROM books;')
             result = db.fetchall()
             return render_template('read.html', result=result)
    

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多