Django:使用信号获取IP地址

时间:2010-12-07 12:31:08

标签: python django signals

我正在尝试记录尝试使用信号登录的用户的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地址,但我的问题是我无法在我的模型中使用请求实例。我不确定从请求中得到的东西是不错的做法。

建议的方法是什么?

任何回复都将不胜感激。

此致 Wenbert

3 个答案:

答案 0 :(得分:1)

  

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

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

  

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

完全没问题。

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

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

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

答案 1 :(得分:1)

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

user_login.request=request
user_login.save()

并在

之类的信号中检索它
instance.request

答案 2 :(得分:0)

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