Python Django日志用户IP用于用户登录失败信号

Python Django日志用户IP用于用户登录失败信号,python,django,ip,signals,Python,Django,Ip,Signals,我想在Django应用程序中记录用户IP地址,特别是登录、注销和失败登录事件。我使用Django内置函数,如下所示: from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed from ipware.ip import get_ip import logging logger = logging.getLogger(__name__) def log_logged_in

我想在Django应用程序中记录用户IP地址,特别是登录、注销和失败登录事件。我使用Django内置函数,如下所示:

from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed
from ipware.ip import get_ip
import logging

logger = logging.getLogger(__name__)

def log_logged_in(sender, user, request, **kwargs):
    logger.info("%s User %s successfully logged in" % (get_ip(request), user))

def log_logged_out(sender, user, request, **kwargs):
    logger.info("%s User %s successfully logged out" % (get_ip(request), user))

def log_login_failed(sender, credentials, **kwargs):
    logger.warning("%s Authentication failure for user %s" % ("...IP...", credentials['username']))

user_logged_in.connect(log_logged_in)
user_logged_out.connect(log_logged_out)
user_login_failed.connect(log_login_failed)
问题是,我没有找到一种方法来获取
用户登录失败
信号的IP,因为此函数的参数()中没有
请求
credentials
参数是一个字典,它只包含
username
password
字段

如何获取此信号的IP地址


非常感谢您的帮助。

不幸的是,
用户登录失败
信号不将请求作为参数传递

签出django轴

它使用自定义视图装饰器来跟踪失败的登录


您可以覆盖登录表单并在那里拦截它。 它在该阶段提出了要求

import logging
from django.contrib.admin.forms import AdminAuthenticationForm
from django import forms

log = logging.getLogger(__name__)


class AuthenticationForm(AdminAuthenticationForm):
    def clean(self):
        # to cover more complex cases:
        # http://stackoverflow.com/questions/4581789/how-do-i-get-user-ip-address-in-django
        ip = request.META.get('REMOTE_ADDR')
        try:
            data = super(AuthenticationForm, self).clean()
        except forms.ValidationError:
            log.info('Login Failed (%s) from (%s)', self.cleaned_data.get('username'), ip)
            raise

        if bool(self.user_cache):
            log.info('Login Success (%s) from (%s)', self.cleaned_data.get('username'), ip)
        else:
            log.info('Login Failed (%s) from (%s)', self.cleaned_data.get('username'), ip)

        return data
要将其安装到站点中,您需要将其附加到django.contrib.admin.site.login\u表单

我建议您在应用程序的ready()方法中这样做:

from django.contrib.admin import site as admin_site

class Config(AppConfig):
    ...

    def ready(self):
        # Attach the logging hook to the login form
        from .forms import AuthenticationForm
        admin_site.login_form = AuthenticationForm

我刚刚发现在较新的Django版本(我使用的是2.1)中更新了这个,现在它在用户登录失败信号中包含了请求对象: