MySQL数据未在Web应用程序中更新 - Python / Flask

时间:2015-08-21 21:11:40

标签: python mysql flask sqlalchemy apache2

我正在使用MySQL后端构建Python / Flask应用程序。许多视图都有将数据提交到路由的表单,然后路由通过db.session.commit()添加数据。我可以确认MySQL db会在每次提交时更新,但是如果我随后多次刷新页面,则数据每次都会更改(即最近添加的项目将消失,重新出现)。

我做了几件事情试图修复:

HTML标头
我知道最好添加大量标题并希望最好,但我添加了这些标题来对抗缓存:

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="private, proxy-revalidate, s-maxage=0, no-cache, no-store, must-revalidate" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

烧瓶标题 我将标题添加到Flask应用程序本身:

response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response.headers["Pragma"] = "no-cache" # HTTP 1.0.
response.headers["Expires"] = "0" # Proxies.

禁用MySQL缓存

SET SESSION query_cache_type=OFF;

Apache2禁用缓存

<filesMatch "\.(html|htm|js|css)$">
    FileETag None
    <ifModule mod_headers.c>
            Header unset ETag
            Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
            Header set Pragma "no-cache"
            Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
    </ifModule>
</filesMatch>

一些行为基于只是窥探和事实:

  • 每当我执行sudo service apache2 restart时,跟随它一切正常。其他一些帖子提到可能会有启动的进程导致此问题?
  • 我正在使用SQLAlchemy作为我的ORM,所以有一次我认为可能是SQLAlchemy缓存信息,所以在每次提交后我都尝试db.session.close()以便每次查询时连接都是新的。< / LI>

任何人都可以帮我一把吗?像许多人一样学习Flask,我是Web应用程序开发的初学者。

非常感谢!

编辑:

  • 当我通过python init.py运行应用程序时,它完全正常。
  • 在快速刷新页面时,我收到间歇性的HTTP 500错误。

编辑2: 这是我正在发布的路由的示例,然后我将重定向到自己并向用户显示GET选项。我希望在提交数据后,后续查询应包含它,但很多时候Web应用程序不会显示最近添加的数据。在多次刷新时,它有时会显示,有时会消失。很奇怪:

@app.route('/projects', methods=['GET','POST'])
@login_required
def projects():
    user = return_current_user()
    if request.method == 'POST':
            if request.form['title'] and request.form['description']:
                    project = Projects(request.form['title'], request.form['description'])
                    if project.title != None and project.description != None:
                            user.projects.append(project)
                            db.session.commit()

            return redirect('/projects')
    elif request.method == 'GET':
            if 'clear-page' in request.args:
                    return redirect('/projects')
            elif 'query' in request.args:
                    projects = Projects.query.filter(Projects.title.like('%'+request.args['query']+'%')).order_by(Projects.timestamp.desc()).all()

            else:
                    projects = Projects.query.order_by(Projects.timestamp.desc()).all()

            return render_template('projects.html', title="Projects", user=user, projects=projects)

2 个答案:

答案 0 :(得分:1)

您可能会尝试关闭您所做的所有特殊更改,显然假设某些缓存机制负责观察结果,并显示烧瓶站点的一些代码。然后开始收集有关实际发生情况的书面证据。

答案 1 :(得分:1)

我实际想出来了 - 解决方法是在查询之前添加db.session.commit()。不确定它是否正确&#34;正确&#34;方法,但它为我的小规模应用程序提供了技巧!