#python #session #redirect #flask #basic-authentication
#python #сессия #перенаправление #flask #basic-аутентификация
Вопрос:
Я предоставляю статический файл, для просмотра которого требуется базовый логин и пароль. В настоящее время я просто использую этот фрагмент: http://flask.pocoo.org/snippets/8 /
прямо сейчас он просто остается активным, пока браузер не завершит работу. Я хотел бы выяснить, как написать простой тайм-аут. Что-то вроде «если прошло 5 минут, отключите это и перенаправьте пользователя обратно на страницу индекса.
Я довольно близок, время ожидания истекло, единственное, что он запоминает это перенаправление, если окно браузера все еще открыто. Любые предложения о том, как справиться с этой последней частью? Файл cookie? Очистка сеанса? Что-то еще?
Спасибо
def check_auth(username, password):
#This function is called to check if a username / password combination is valid.
return username == 'oneshot' and password == 'private'
def authenticate():
# Sends a 401 response that enables basic auth
return Response(
'Could not verify your access level for that URL.n'
'You have to login with proper credentials', 401,
{'WWW-Authenticate': 'Basic realm="Login Required"'})
def requires_auth(f):
@wraps(f)
def decorated(*args, **kwargs):
start_time = session.get('session_time', None)
if start_time is None:
start_time = datetime.datetime.now()
session['session_time'] = start_time
elapsed = datetime.datetime.now() - start_time
if datetime.timedelta(0, 60, 0) < elapsed:
return redirect(url_for('index'))
auth = request.authorization
if not auth or not check_auth(auth.username, auth.password):
return authenticate()
return f(*args, **kwargs)
return decorated
Ответ №1:
Вот что я в итоге сделал:
def login_required(test):
@wraps(test)
def wrap(*args, **kwargs):
if 'logged_in' in session:
# session is always none
start_time = session.get('session_time', None)
#get the current time and set it as start time, this is also your session timer start
if start_time is None:
start_time = datetime.datetime.now()
session['session_time'] = start_time
# make an end time 1 minute from now
end_time = start_time datetime.timedelta(minutes=1)
#find the current time in a for loop maybe? or just an if will probably work.
if datetime.datetime.now() > end_time:
return redirect(url_for('expired', next=request.url))
session.clear()
start_time = session.get('session_time', None)
return test(*args, **kwargs)
else:
return redirect(url_for('login', next=request.url))
return wrap
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != app.config['USERNAME']:
error = 'Invalid username'
elif request.form['password'] != app.config['PASSWORD']:
error = 'Invalid password'
else:
session['logged_in'] = True
return redirect(url_for('media'))
return render_template('login.html', error=error)
@app.route('/expired')
def expired():
session.clear()
return render_template('expired.html')