这里有一个与Django用户集成的新答案(
AbstractUser
)详情如下:
模型py
(创建从Django用户继承的模型):
from django.contrib.auth.models import AbstractUser
from django.db import models
class UserModel(AbstractUser): # Inherit from django user
last_logout = models.DateTimeField(null=True, blank=True)
status = models.CharField(max_length=64)
ip = models.GenericIPAddressField(null=True)
def __str__(self):
return '{} - {}'.format(self.username, self.ip)
信号py
(记录到Django模型和日志):
from django.contrib.auth.signals import user_logged_out
from django.dispatch import receiver
from django.utils import timezone
from <model> import UserModel # above model
from logging import getLogger
logger = getLogger(__name__)
def get_client_ip(request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
return ip
@receiver(user_logged_out)
def user_logged_out_callback(sender, request, user, **kwargs):
ip = get_client_ip(request)
username = request.user.username # get the username.
now = timezone.now()
logger.warn('{} logged out with {} IP'.format(user, ip)) # recording to log
UserModel.objects.filter(username=username).update(last_logout=now,
status='user_logged_out',
ip=ip
) # recording to the model
[
笔记
]: