Chainsaw
Chainsaw

Reputation: 311

Django - How get IP of request in a custom receiver?

I have following code:

@receiver(user_logged_in)
def user_logged_in_callback(sender, request, user, **kwargs):  
    ip = request.META.get('REMOTE_ADDR')
    AuditEntry.objects.create(action='User logged in', ip=ip, username=user.username)

It works great.

In views.py I have a custom receiver:

@receiver(pre_save, sender=User)
def user_updated(sender, **kwargs):
    user = kwargs.get('instance', None)
    ip = request.META['REMOTE_ADDR']
    if user:
        new_password = user.password
        try:
            old_password = User.objects.get(pk=user.pk).password
        except User.DoesNotExist:
            old_password = None
        if new_password != old_password:
            AuditEntry.objects.create(action='Password has changed', ip="127.0.0.1", username=user.username)

For sure it falls with "no request found" error.

I can't figure out how to extract IP.

Thank you.

Or maybe I am overengineering my code? All I need is to create AuditEntry with parameters after User model has changed.

Upvotes: 0

Views: 109

Answers (1)

GrvTyagi
GrvTyagi

Reputation: 4497

To me, It looks like you forgot the request param in your function.

You need to pass the request param.

Upvotes: 1

Related Questions