Проблемы кэширования браузера в колбе
Я создал сайт с использованием фляжки (www.csppdb.com). Иногда, когда я регистрируюсь как один пользователь, выйдите из системы, а затем войдите в систему как другой пользователь. Я все еще вижу страницы от первого пользователя, которого я вошел в систему. Эта проблема немедленно исправляется, когда страница обновляется. Я думаю, что это называется "кешированием", если я не ошибаюсь. Есть ли способ отключить это на уровне сайта, чтобы каждая посещаемая страница нуждалась в новом обновлении?
Это походит на разделение вашего компьютера с другом. Он входит в Facebook, затем выходит из системы. Теперь вы заходите на свой компьютер, и вы видите его профиль... (неудобно). После обновления страницы проблема исправлена.
Вот мой код. Я использовал флеш-логин, но затем попытался "свернуть свой"
from flask.ext.mysql import MySQL
import os
from flask import Flask, request, jsonify, session, url_for, redirect, \
render_template, g, flash
from data import *
from werkzeug import check_password_hash, generate_password_hash
import config
app = Flask(__name__)
mysql = MySQL()
app.config['MYSQL_DATABASE_HOST'] = os.environ['MYSQL_DATABASE_HOST'] if 'MYSQL_DATABASE_HOST' in os.environ else config.MYSQL_DATABASE_HOST
app.config['MYSQL_DATABASE_PORT'] = os.environ['MYSQL_DATABASE_PORT'] if 'MYSQL_DATABASE_PORT' in os.environ else config.MYSQL_DATABASE_PORT
app.config['MYSQL_DATABASE_USER'] = os.environ['MYSQL_DATABASE_USER'] if 'MYSQL_DATABASE_USER' in os.environ else config.MYSQL_DATABASE_USER
app.config['MYSQL_DATABASE_PASSWORD'] = os.environ['MYSQL_DATABASE_PASSWORD'] if 'MYSQL_DATABASE_PASSWORD' in os.environ else config.MYSQL_DATABASE_PASSWORD
app.config['MYSQL_DATABASE_DB'] = os.environ['MYSQL_DATABASE_DB'] if 'MYSQL_DATABASE_DB' in os.environ else config.MYSQL_DATABASE_DB
mysql.init_app(app)
if 'SECRET_KEY' in os.environ: app.config['SECRET_KEY'] = os.environ['SECRET_KEY']
else: app.config['SECRET_KEY'] = os.urandom(24)
def connect_db(): return mysql.connect()
def check_auth():
g.user = None
if 'username' in session:
g.user = get_user(session['username'])
return
return redirect(url_for('login'))
@app.route('/')
def home():
if 'username' in session: return redirect(url_for('main'))
return render_template('home.html')
def connect_db(): return mysql.connect()
@app.teardown_request
def teardown_request(exception):
if exception: print exception
g.db.close()
@app.before_request
def before_request():
print session.keys(), session.values()
print("before request")
print ('username' in session, "in session?")
g.db = connect_db()
g.user = None
if "username" in session:
g.user = get_user(session['username'])
@app.route('/login/', methods=['GET', 'POST'])
def login():
"""Logs the user in."""
if 'username' in session:
return redirect(url_for('main'))
error = None
if request.method == 'POST':
print("login hit")
user = get_user(request.form['username'])
if user is None:
error = 'Invalid username'
print error
elif not check_password_hash(user.password, request.form['password']):
error = 'Invalid password'
print error
else:
flash('You were logged in')
print "logged in"
session['username'] = request.form['username']
g.user = request.form['username']
print error, "error"
return redirect(url_for('main'))
return render_template('login.html', error=error)
Ответы
Ответ 1
Установка кеша в max-age = 0 исправлена.
@app.after_request
def add_header(response):
"""
Add headers to both force latest IE rendering engine or Chrome Frame,
and also to cache the rendered page for 10 minutes.
"""
response.headers['X-UA-Compatible'] = 'IE=Edge,chrome=1'
response.headers['Cache-Control'] = 'public, max-age=0'
return response
Ответ 2
Чтобы остановить кеширование браузеров на этих страницах, вам нужно установить некоторые заголовки HTTP-ответов.
Cache-Control: no-cache, no-store
Pragma: no-cache
Как только вы сделаете это, браузер не будет кэшировать эти страницы. Я не знаю, как это сделать с "флягой", поэтому я оставлю это как упражнение для вас:)
Этот вопрос показывает, как добавить заголовок ответа Flask/Werkzeug, как подключить заголовок длины HTTP-содержимого к загрузке файла