Django сохраняет IP пользователя при каждом новом входе в систему

Каждый раз, когда пользователь входит в систему, я хочу хранить IP-адрес в списке соответствующего пользователя, чтобы у каждого пользователя был список со всеми IP-адресами, используемыми при входе.

Как я могу это сделать?

Пользовательская модель пользователя

class NewUser(AbstractBaseUser, PermissionsMixin):

    email = models.EmailField(_('E-Mail'), unique=True)
    username = models.CharField(max_length=150, unique=True)
    start_date = models.DateTimeField(default=timezone.now)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    last_login = models.DateTimeField(default=timezone.now)
    code = models.ImageField(blank=True, upload_to='code')

    objects = CustomAccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', ]

Просмотры SingIn

def signin_view(request):

    if request.user.is_authenticated:
        return HttpResponseRedirect('/')

    form = SigninForm(request.POST or None)
    if form.is_valid():
        time.sleep(2)
        email = form.cleaned_data.get("email")
        password = form.cleaned_data.get("password")
        user = authenticate(request, email=email, password=password)
        if user != None:
            login(request, user)
            return redirect("/dashboard/")
        else:
            request.session['invalid_user'] = 1 
    return render(request, "signin.html", {'form': form})

Я знаю, как получить IP, но я хочу знать, как мне сохранить его в чем-то вроде списка

IP-адрес пользователя хранится в объекте request. Вы можете получить к нему доступ следующим образом:

request.META.get("REMOTE_ADDR")

Если вы используете PostgreSQL в качестве базы данных, вы можете использовать JSONField или ArrayField. Специфические поля PostgreSQL

Я никогда не использовал ArrayField, но думаю, что для данного конкретного случая использования он будет более показателен, чем JSONField, если только вы не хотите хранить дополнительную информацию об IP-адресе каждого пользователя.

Итак, продолжим:

# Step 1: Add an ArrayField of CharFields to your NewUser model

from django.contrib.postgres.fields import ArrayField

class NewUser(AbstractBaseUser, PermissionsMixin):
    ...
    ip_address_list = ArrayField(models.CharField(max_length=15))
    ...

# Step 2: Refactor your view 

# Here i made a little function to store the IP address because
# I had to run it twice
def store_ip_address(request):
    new_user = request.user
    new_user.ip_address_list.append(request.META.get('REMOTE_ADDR'))
    new_user.save()

def signin_view(request):

    if request.user.is_authenticated:
        store_ip_address(request) ### New ###
        return HttpResponseRedirect('/')

    form = SigninForm(request.POST or None)
    if form.is_valid():
        time.sleep(2)
        email = form.cleaned_data.get("email")
        password = form.cleaned_data.get("password")
        user = authenticate(request, email=email, password=password)
        if user != None:
            login(request, user)
            store_ip_address(request) ### New ###
            return redirect("/dashboard/")
        else:
            request.session['invalid_user'] = 1 
    return render(request, "signin.html", {'form': form})

Я не тестировал это, дайте мне знать, если это не работает

Вернуться на верх