개발 이슈,해결법

[Django] 장고 user 모델 접속 로그 구현

난쏘공돌이 2022. 5. 30. 22:31

개발을 하다보면 누군가의 요청에 의해서 접속로그, 실패로그를 찍을 일이 생기더라구요.

해당 방법은 user 모델을 상속한 프로젝트에 한하며, 3가지 로그를 찍습니다.

  • 접속성공
  • 접속실패
  • 로그아웃
#  로그기능 추가.
from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed
from django.dispatch import receiver


class Logtbl(models.Model):
    action = models.CharField(max_length=64)
    ip = models.GenericIPAddressField(null=True)
    username = models.CharField(max_length=256, null=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return '{0} - {1} - {2}'.format(self.action, self.username, self.ip)

    def __str__(self):
        return '{0} - {1} - {2}'.format(self.action, self.username, self.ip)


@receiver(user_logged_in)
def user_logged_in_callback(sender, request, user, **kwargs):
    ip = request.META.get('REMOTE_ADDR')
    Logtbl.objects.create(action='user_logged_in', ip=ip, username=user.user_email)


@receiver(user_logged_out)
def user_logged_out_callback(sender, request, user, **kwargs):
    ip = request.META.get('REMOTE_ADDR')
    Logtbl.objects.create(action='user_logged_out', ip=ip, username=user.user_email)
    
    
@receiver(user_login_failed)
def user_login_failed_callback(sender, request, credentials, **kwargs):
    ip = request.META.get('REMOTE_ADDR')
    Logtbl.objects.create(action='user_login_failed',ip=ip, username=credentials.get('username', None))

해당 코드의 경우 각 데코레이터 관련 문서는 해당 문서를 확인해 주시면 되겠습니다

https://docs.djangoproject.com/en/4.0/ref/contrib/auth/

 

django.contrib.auth | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

해당 문서에서는 user 모델의 전반적인 설명과, auth에 대한 설명이 나와 있습니다.

admin.py는 다음과 같이 작성해주시면 됩니다.

from django.contrib import admin
from . import models
# Register your models here.

@admin.register(models.User)
class UserAdmin(admin.ModelAdmin):
    pass

from django.contrib import admin
from .models import Logtbl

@admin.register(Logtbl)
class LogtblAdmin(admin.ModelAdmin):
    list_display = ['action', 'username', 'ip','timestamp',]
    list_filter = ['action','username']

출처

https://stackoverflow.com/questions/28807125/django-log-user-ip-for-user-login-failed-signal