2010-12-07 125 views
0

我正在嘗試登錄嘗試使用信號登錄的用戶的IP地址。我該怎麼做呢?Django:使用信號獲取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地址:request.META [REMOTE_ADDR]我的問題是,我不能在我的模型中使用的Request實例。我不確定從請求中得到什麼是好的做法。

這樣做的建議方法是什麼?

任何答覆將不勝感激。

問候, Wenbert

回答

1

雖然我知道如何使用獲得的IP地址:request.META [REMOTE_ADDR]我的問題是,我不能在我的模型中使用的Request實例。

這就是爲什麼你有查看功能。

我不確定從請求中得到的東西是不是很好的做法。

這很好。

  • 這就是爲什麼請求被提供給每個視圖函數的原因。

  • 這就是爲什麼你有查看功能。

只要在視圖函數中做到這一點。除非你正在編寫一種新的數據庫接口,否則不要惹惱信號。

+0

不是一個答案,但一個很好的建議... – 2010-12-07 12:55:05

1

由於實例被傳遞到信號中,並且實例與保存的實際是相同的對象,因此可以在保存實例時將請求對象或IP附加到實例。

user_login.request=request 
user_login.save() 

和檢索它在信號像

instance.request 
0

的Django有一個信號,只要在用戶登錄被稱爲user_logged_in火災。通過給這個信號附加一個信號處理程序,你可以得到登錄事件的通知。處理程序通過了userrequest對象。正如您所注意到的,您可以從request對象獲取IP地址。