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})
Я не тестировал это, дайте мне знать, если это не работает