Nginx+Django的Xadmin操作日志IP记录问题

用了Nginx反代后,在Django中用Xadmin进行操作后,日志记录中的IP总是本地IP:127.0.0.1

Nginx+Django的Xadmin操作日志IP记录问题_第1张图片

因为xadmin代码中使用了request.META.get('REMOTE_ADDR')直接获取IP,这样是获取到的是代理的IP,也就是本机IP

要显示真实IP,先要设置Nginx,

            proxy_set_header REMOTE_ADDR $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            real_ip_recursive on;

定义获取代理真实IP的函数

def get_client_ip(request):

    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')

    if x_forwarded_for:

        ip = x_forwarded_for.split(',')[-1].strip()

    else:

        ip = request.META.get('REMOTE_ADDR')

    return ip

然后修改xadmin代码views/base.py

找到 class BaseAdminObject 下的Log函数,修改成下面这样,注意要自己引用一个刚才定义的那个函数

log = Log(

            user=self.user,

            # ip_addr=self.request.META['REMOTE_ADDR'],  #这是原来的

            ip_addr=get_client_ip(self.request),  #这是修改后的

            action_flag=flag,

            message=message

        )

修改后就可以获取到真实IP了

你可能感兴趣的:(Nginx+Django的Xadmin操作日志IP记录问题)