浏览器在烧瓶中缓存问题 [英] Browser caching issues in flask

查看:154
本文介绍了浏览器在烧瓶中缓存问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用烧瓶建立了一个网站( www.csppdb.com )。有时当我以一个用户身份登录时,注销,然后以另一个用户身份登录,我仍然看到我登录的第一个用户的页面。当页面刷新时,这个问题立即解决。如果我没有弄错的话,我认为这叫做缓存。有没有什么办法可以禁用这个网站的广泛级别,以便每一个被访问的页面需要一个新的刷新?

这就像是与朋友分享你的电脑。他登录到Facebook,然后注销。现在你登录他的电脑,你看到他的个人资料...(尴尬)。刷新页面后,问题得到解决。

这是我的一些代码。我正在使用烧瓶登录,但我然后试图roll我自己的

 从flask.ext.mysql导入MySQL 
从flask导入os
烧瓶,请求,jsonify,session,url_for,重定向,\
render_template,g,flash
从数据导入*
from werkzeug import check_password_hash ,generate_password_hash
import config
$ b $ app = Flask(__ name__)
mysql = MySQL()
$ b $ app.config ['MYSQL_DATABASE_HOST'] = os。如果'MYSQL_DATABASE_HOST'在os.environ其他配置。如果'MYSQL_DATABASE_PORT'在os.environ其他config.MYSQL_DATABASE_HOST
app.config ['MYSQL_DATABASE_PORT'] = os.environ ['MYSQL_DATABASE_PORT']。 MYSQL_DATABASE_PORT
app.config ['MYSQL_DATABASE_USER'] = os.environ ['MYSQL_DATABASE_USER'] if os.environ中的'MYSQL_DATABASE_USER'else config.MYSQL_DATABASE_USER
app.config ['MYSQL_DATABASE_PASSWORD'] = os.environ ['MYSQL_DATABASE_PASSWORD']如果'MYS在os.environ中的'QL_DATABASE_PASSWORD'其他配置.MYSQL_DATABASE_PASSWORD
app.config ['MYSQL_DATABASE_DB'] = os.environ ['MYSQL_DATABASE_DB'] if os.environ中的'MYSQL_DATABASE_DB'else config.MYSQL_DATABASE_DB

mysql.init_app(app)
$ b如果os.environ中的'SECRET_KEY':app.config ['SECRET_KEY'] = os.environ ['SECRET_KEY']
else:app.config ['SECRET_KEY'] = os.urandom(24)

def connect_db():返回mysql.connect()

def check_auth():
g。 user = None
如果session中有'username':
g.user = get_user(session ['username'])
return
return redirect(url_for('login'))

$ app_route('/')
def home():
如果用户名在会话中:return redirect(url_for('main'))
返回render_template('home.html')

def connect_db():返回mysql.connect()

@ app.teardown_request
def teardown_request(异常) :
如果是excepti on:print exception
g.db.close()

@ app.before_request
def before_request():
打印session.keys(),session.values ()
print(before request)
print('会话中的用户名',在会话中)
g.db = connect_db()
g.user =
如果在会话中使用username:
g.user = get_user(session ['username'])


@ app.route('/ login / ','methods'=''GET','POST'])
def login():
登录用户。
如果用户名在会话中:
return redirect(url_for('main'))

error = None
if request.method =='POST':
print(login hit)
user = get_user(request.form ['username'])
如果用户是None:
error ='用户名无效
打印错误
elif不是check_password_hash .password,request.form ['password']):
error ='密码无效
打印错误
其他:
flash('您已经登录')
打印登录
session ['username'] = request.form [ ('main'))
$ b $返回重定向b返回render_template('login.html',error = error)


解决方案

  @ app.after_request 
def add_header (响应):

将标题添加到强制最新的IE呈现引擎或Chrome Frame
,并将渲染的页面缓存10分钟。

response.headers ['X-UA-Compatible'] ='IE = Edge,chrome = 1'
response.headers ['Cache-Control'] ='public ,max-age = 0'
返回响应


I have built a website using flask (www.csppdb.com). Sometimes when I log in as one user, log out, then login as another user I still see pages from the first user I logged in as. This problem is immediately fixed when the page is refreshed. I think this is called "caching" if I am not mistaken. Is there any way I could disable this on a site wide level so that every page that is visited needs a new refresh?

It would be like sharing your computer with a friend. He logs into Facebook, then logs out. Now you log in on his computer and you see his profile... (awkward). After you refresh the page the problem is fixed.

Here is some of my code. I was using flask-login but I then tried to "roll my own"

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)

解决方案

Setting the cache to be max-age=0 fixed it.

@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

这篇关于浏览器在烧瓶中缓存问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆