![](/img/trans.png)
[英]is it possible to get exact client local IP address using django under mikrotik hotspot network?
[英]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
的信號,該信號會在用戶登錄時觸發。 通過在此信號上附加信號處理程序,可以通知您登錄事件。 處理程序將傳遞給user
和request
對象。 如您所知,您可以從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.