22

フラスコを使用してWebサイトを構築しました(www.csppdb.com)。1人のユーザーとしてログインし、ログアウトしてから別のユーザーとしてログインすると、最初にログインしたユーザーのページが表示されることがあります。この問題は、ページが更新されるとすぐに修正されます。私が間違えなければ、これは「キャッシング」と呼ばれると思います。サイト全体のレベルでこれを無効にして、アクセスするすべてのページを新しく更新する必要があるようにする方法はありますか?

それはあなたのコンピュータを友人と共有するようなものです。彼は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)
4

2 に答える 2

31

キャッシュを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
于 2012-12-10T09:28:43.697 に答える
3

この種のページでブラウザのキャッシュを停止するには、いくつかのHTTP応答ヘッダーを設定する必要があります。

Cache-Control: no-cache, no-store
Pragma: no-cache

これを行うと、ブラウザはそれらのページをキャッシュしません。「フラスコ」でこれを行う方法がわからないので、演習として残しておきます:)

この質問は、応答ヘッダーを追加する方法を示しています。Flask/WerkzeugHTTPコンテンツ長ヘッダーをファイルのダウンロードに添付する方法

于 2012-12-07T17:27:54.503 に答える