Я знаю, что это возможный дубликат поста, я нашел решение для этого, но эти посты принадлежат более ранним версиям Django, и я не могу получить новый синтаксис.Может кто-нибудь дать мне совет, пожалуйста?
Я пытаюсь запретить пользователям использовать одну и ту же учетную запись одновременно.Поэтому, когда кто-то входит в учетную запись, если пользователь и пароль в порядке, я перебираю таблицу django_session, чтобы определить, есть ли другой сеанс с той же учетной записью, если да, закройте этот сеанс и запустите последний.
После auth.authenticate (бла-бла):
if user is not None:
# Checks if there's any other active session with the same account
for session in Session.objects.filter(session_key=request.session.session_key): # //aq
data = session.get_decoded()
print(data.get('_auth_user_id', None))
if data.get('_auth_user_id', None) == str(user.id):
session.delete()
Но что-то не работает с этим синтаксисом.Я не могу получить идентификатор пользователя сеанса.Когда пользователь входит в систему, я использую request.session['logueado'] = user.id
и auth.login(request, user)
.
Это должно быть похоже на систему «последний, кто войдет в систему».
РЕДАКТИРОВАТЬ: Весь код:
def login(request):
if 'logged' in request.session:
return redirect(main)
if request.method == "GET":
form = LoginForm
return render(request, "login.html", {"form": form})
if request.method == "POST":
print('POST method.')
form = LoginForm(request.POST)
if form.is_valid():
print('Valid form.')
user_name = form.cleaned_data.get('username')
user_pass = form.cleaned_data.get('password')
user = auth.authenticate(username=user_name, password=user_pass)
if user is not None:
for session in Session.objects.filter(session_key=request.session.session_key):
print('Hello')
data = session.get_decoded()
if data.get('_auth_user_id', None) == request.session.session_key:
print('Same account in more than 1 session.')
session.delete()
#------------------------------------------------------------------
request.session['logged'] = user.id
print(request.session['logged'])
auth.login(request, user)
request.session.set_expiry(0) #
return redirect(main)
else:
return render(request, "loginError.html", {"form": form})
РЕДАКТИРОВАТЬ: окончательное решение: (Спасибо, Дэниэл Роузман!)
user = auth.authenticate(username=user_name, password=user_pass)
if user is not None:
# Checks if there's another session with the same acc
Sessions = Session.objects.all()
for row in Sessions:
print(row.get_decoded().get('_auth_user_id'))
print(user.id)
if str(row.get_decoded().get("_auth_user_id")) == str(user.id):
print('Same sessions')
row.delete()
request.session['logged'] = user.id