我正在使用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
时,跟随它一切正常。其他一些帖子提到可能会有启动的进程导致此问题?db.session.close()
以便每次查询时连接都是新的。< / LI>
任何人都可以帮我一把吗?像许多人一样学习Flask,我是Web应用程序开发的初学者。
非常感谢!
编辑:
python init.py
运行应用程序时,它完全正常。编辑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)
答案 0 :(得分:1)
您可能会尝试关闭您所做的所有特殊更改,显然假设某些缓存机制负责观察结果,并显示烧瓶站点的一些代码。然后开始收集有关实际发生情况的书面证据。
答案 1 :(得分:1)
我实际想出来了 - 解决方法是在查询之前添加db.session.commit()
。不确定它是否正确&#34;正确&#34;方法,但它为我的小规模应用程序提供了技巧!