Наиболее оптимизированный способ удаления всех сеансов для конкретного пользователя в Django?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Наиболее оптимизированный способ удаления всех сеансов для конкретного пользователя в Django?

Сообщение Anonymous »

Я запускаю Django 1.3, используя промежуточное программное обеспечение сеансов и промежуточное программное обеспечение Auth: < /p>

Код: Выделить всё

# settings.py

SESSION_ENGINE = django.contrib.sessions.backends.db   # Persist sessions to DB
SESSION_COOKIE_AGE = 1209600                           # Cookies last 2 weeks
Каждый раз, когда пользователь входит в систему из другого местоположения (различный компьютер/браузер), новый сеанс () создается и сохраняется с уникальным session_id . Это может привести к нескольким записям базы данных для одного и того же пользователя. Их логин сохраняется на этом узле до тех пор, пока не будет удален или срок действия сеанса. Таким образом, после изменения пароля они вынуждены повторно логин. Это для целей безопасности, например, если ваш компьютер был украден, или вы случайно оставили себя вошли в общедоступный терминал.

Код: Выделить всё

# sessions_helpers.py

from django.contrib.sessions.models import Session
import datetime

def all_unexpired_sessions_for_user(user):
user_sessions = []
all_sessions  = Session.objects.filter(expire_date__gte=datetime.datetime.now())
for session in all_sessions:
session_data = session.get_decoded()
if user.pk == session_data.get('_auth_user_id'):
user_sessions.append(session)
return user_sessions

def delete_all_unexpired_sessions_for_user(user, session_to_omit=None):
for session in all_unexpired_sessions_for_user(user):
if session is not session_to_omit:
session.delete()
< /code>

Очень упрощенное представление: < /p>

# views.py

from django.http import HttpResponse
from django.shortcuts import render_to_response
from myapp.forms import ChangePasswordForm
from sessions_helpers import delete_all_unexpired_sessions_for_user

@never_cache
@login_required
def change_password(request):
user = request.user

if request.method == 'POST':
form = ChangePasswordForm(data=request)

if form.is_valid():
user.set_password(form.get('password'))
user.save()
request.session.cycle_key()         # Flushes and replaces old key. Prevents replay attacks.
delete_all_unexpired_sessions_for_user(user=user, session_to_omit=request.session)
return HttpResponse('Success!')

else:
form = ChangePasswordForm()

return render_to_response('change_password.html', {'form':form}, context_instance=RequestContext(request))
Как вы можете видеть в sessions_helpers.py , я должен вытащить каждый непредвиденное сеанс из db, session.objects.filter (истекать_date__gte = dateTime.datetime.now ()) , декодировать все, а затем проверить, что он может быть пользователем. Это будет чрезвычайно дорого для базы данных, если, скажем, 100 000+ сеансов. Есть ли настройка промежуточного программного обеспечения для сеансов/авто, которая позволит вам сохранить имя пользователя в качестве столбца в таблице сеансов, чтобы я мог запустить SQL против этого, или мне придется изменить сеансы для этого? За пределами коробки есть только session_key , session_data и expire_date столбцы. :)

Подробнее здесь: https://stackoverflow.com/questions/665 ... -in-django
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»