![](/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.