繁体   English   中英

Django:使用信号获取IP地址

[英]Django: Get IP Address using a signal

我正在尝试记录尝试使用信号登录的用户的 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)

虽然我知道如何使用 request.META[REMOTE_ADDR] 获取 IP 地址,但我的问题是我无法在我的 model 中使用请求实例。我也不确定从请求中获取某些内容是否是好的做法。

这样做的推荐方法是什么?

任何答复将不胜感激。

问候,温伯特

尽管我知道如何使用:request.META [REMOTE_ADDR]获取IP地址,但我的问题是我无法在模型中使用请求实例。

这就是你有视图功能的原因。

我不确定从请求中得到的东西是不错的做法。

这很好。

  • 这就是为每个视图功能提供请求的原因。

  • 这就是你有视图功能的原因。

只需在视图功能中执行此操作即可。 除非你正在编写一种新的数据库接口,否则不要乱用信号。

当实例传递给信号并且实例实际上是保存的对象时,您可以在保存实例时将请求对象或IP附加到实例。

user_login.request=request
user_login.save()

并像这样在信号中检索它

instance.request

Django有一个名为user_logged_in的信号,该信号会在用户登录时触发。 通过在此信号上附加信号处理程序,可以通知您登录事件。 处理程序将传递给userrequest对象。 如您所知,您可以从request对象中获取IP地址。

这是一个非常古老的问题,但我今天遇到了同样的问题,这是谷歌的第一个热门问题。 所以也许这对其他人也有帮助。 这就是它对我有用的方式。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM