当前位置: 首页 > 面试题库 >

Flask中的浏览器缓存问题

颛孙博易
2023-03-14
问题内容

我已经使用flask建立了一个网站(www.csppdb.com)。有时,当我以一个用户身份登录时,先注销,然后以另一个用户身份登录,我仍然会看到以第一个用户身份登录的页面。刷新页面后,立即解决此问题。如果我没记错的话,我认为这被称为“缓存”。有什么办法可以在站点范围内禁用此功能,以便访问的每个页面都需要重新刷新?

这就像与朋友共享您的计算机。他登录Facebook,然后注销。现在,您登录他的计算机,然后看到他的个人资料…(尴尬)。刷新页面后,问题已解决。

这是我的一些代码。我当时使用flask-login,但随后尝试“自己滚动”

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)

问题答案:

将缓存设置为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


 类似资料:
  • 我有一个使用assetic的Symfony2应用程序。一切都很好,只是在localhost中,浏览器不会缓存我的资产。 任何想法,为什么以下资产没有得到缓存响应304和毫秒,而是与200响应,需要大约15秒... 响应头 Accep-Ranges bytes Cache-Control max-age=604800 Connection Keve-Alive Content-Encode gzip

  • 问题内容: 早上好,我在生产环境中有一个Web应用程序。用户每天都在使用它,当我发布更新时,用户回到该Web应用程序时,他会查看该Web应用程序的旧版本。他需要刷新浏览器以加载新版本。我怎么解决这个问题?我每次发布更新时(每周3-4次)都无法告诉数百名用户刷新页面。 问题答案: 一个简单的解决方案是将 代表时间戳或会话ID的查询字符串 添加到文件中。 例如,在我们的春季应用中,我们只需使用: 您也

  • 推荐: http://www.cnblogs.com/skynet/archive/2012/11/28/2792503.html 304 Not Modified

  • 日期:1998年10月30日星期五格林尼治时间13:19:41 服务器:Apache/1.3.3(Unix) 缓存控制:max-age=3600,必须重新验证 有效期:1998年10月30日星期五格林尼治时间14:19:41 最后修改:1998年6月29日星期一02:28:12格林尼治时间 ETAG:“3E86-410-3596FBBC”

  • 问题内容: 有关CSS和浏览器的快速问题。我尝试搜索SO,发现了一些类似的帖子,但没有确定的内容。 我在网络项目中使用了一个或两个CSS文件。这些在我的网页的标题中引用。一旦我点击了我的页面之一,是否会缓存CSS,以便不随每个请求重新下载CSS?希望如此。IE,Firefox和Safari处理不同吗?如果浏览器已关闭,那么在打开新的浏览器实例时,首次访问CSS是否会刷新? 问题答案: 您的文件 可

  • 我尝试使用ETAG从api请求缓存json响应。我调用类似http://localhost:3000/api/config的代码,并获取: Thx响应。