簡體   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