python Django:使用信号获取IP地址

zbsbpyhn  于 2023-01-08  发布在  Python
关注(0)|答案(4)|浏览(165)

我正在尝试记录使用信号登录的用户的IP地址,该如何操作?
我已经捕获了登录的日期时间。

#models.py
class UserLogin(models.Model):
    """user details when logging in"""        
    user        = models.ForeignKey(User)
    timestamp   = models.DateTimeField(auto_now=True)

这是针对信号:

#models.py
def user_login_save(sender, instance, **kwargs):
if instance.last_login:
    old = instance.__class__.objects.get(pk=instance.pk)
    if instance.last_login != old.last_login:
        instance.userlogin_set.create(timestamp=instance.last_login)

models.signals.post_save.connect(user_login_save,  sender=User)

尽管我知道如何使用以下方法获取IP地址: meta[REMOTE_ADDR]我的问题是我不能在我的模型中使用请求示例。我也不确定从请求中获取一些东西是否是好的实践。
推荐的方法是什么?
如有任何答复,将不胜感激。
问候你,温伯特

5fjcxozz

5fjcxozz1#

尽管我知道如何使用以下方法获取IP地址:request.META [REMOTE_ADDR]我的问题是我不能在我的模型中使用请求示例。
这就是为什么要有视图函数。
我也不确定从请求中获得一些东西是否是好的实践。
这是非常好的。

  • 这就是为什么请求被提供给每个视图函数。
  • 这就是为什么要有视图函数。

只要在视图函数中就可以了,不要乱加信号,除非你在写一种新的数据库接口。

nlejzf6q

nlejzf6q2#

由于示例被传递到信号中,并且示例实际上是保存的同一个对象,因此您可以在保存示例时将请求对象或IP附加到示例。

user_login.request=request
user_login.save()

并在信号中检索它

instance.request
vaqhlq81

vaqhlq813#

Django有一个当用户登录时触发的信号user_logged_in。通过在这个信号上附加一个信号处理程序,你可以得到登录事件的通知。userrequest对象传递给这个处理程序。正如你所注意到的,你可以从request对象中获得IP地址。

kwvwclae

kwvwclae4#

这是一个很老的问题,但我今天遇到了同样的问题,这是谷歌的第一个热门主题。所以也许这对其他人也有帮助。这就是我的工作原理。

from django.contrib.auth.signals import (
    user_logged_in,
    user_logged_out,
    user_login_failed,
)
from django.dispatch import receiver
import logging

user_logger = logging.getLogger("user")

@receiver(user_logged_in)
def log_user_login(sender, user, **kwargs):
    """log user "login" to log-file setup in django settings.py"""
    # if the IP-ADRESS is 127.0.0.1 from external users then check this     
    # https://stackoverflow.com/questions/4581789/how-do-i-get-user-ip-address-in-django
    request = kwargs["request"]
    ip_address = request.META.get("REMOTE_ADDR")
    user_logger.info(f"{user} login successful. IP-Address: {ip_address}")

# other functions deleted for brevity

相关问题