توی یه پروژه خواستیم یک نام کاربری دو تا session نداشته باشه یعنی یه کاربر توی دوتا مرورگر یا دو تا سیستم لاگین نکنه. برای این کار از Middleware و Signal توی پروژه استفاده کردم.
توی Middleware.py توی app مربط کد زیر کد زیر رو زدم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from django.contrib.auth import logout from django.utils.deprecation import MiddlewareMixin class PreventConcurrentLoginsMiddleware(MiddlewareMixin): def process_request(self, request): if 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: logout(request) elif not user.session_key: user.session_key = current_session_key user.save() |
حالا اینو توی MIDDLEWARE توی SETTING اضافه میکنیم.
Signal زیر رو اضافه میکنم که اگر کسی logtout کرد session اش پاک شه که بشه جای دیگه لاگین کنن:
1 2 3 4 5 6 7 8 9 10 11 12 |
from django.contrib.auth.signals import user_logged_out from django.dispatch import receiver from django.conf import settings from django.contrib.auth import get_user_model @receiver(user_logged_out) def reset_session_key(sender, request, user, **kwargs): User = get_user_model() if user.is_authenticated: user.session_key = None user.save() |