اگر بخایم یک نام کاربری نتونه همزمان توی دو تا سیستم لاگین کنه باید چیکار کنیم؟ باید یک Middleware بنویسیم که اگر سشن کاربر با سشن ذخیره شده قبلی برابر نبود اون رو پاک کنه و جدید رو بنویسه.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class PreventConcurrentLoginsMiddleware(MiddlewareMixin): def process_request(self, request): if request.user and request.user.is_authenticated: current_session_key = request.session.session_key user = request.user if user.session_key and user.session_key != current_session_key: try: previous_session = Session.objects.get(session_key=user.session_key) previous_session.delete() except Session.DoesNotExist: pass user.session_key = current_session_key user.save() |
حالا این میدلویر رو باید اضافه کنیم
1 2 3 4 5 6 7 8 9 10 |
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'core.middleware.PreventConcurrentLoginsMiddleware', ] |
اگر اون سشنی که پاک شده بعدش بیاد لاگین بزنه به ارور میخوره بنابراین باید این تابع رو یه تغییراتی بدیم
1 2 3 4 5 6 |
def custom_logout(request): if request.user.is_authenticated: request.user.session_key = None request.user.save() logout(request) return redirect('login') |