用了Nginx反代后,在Django中用Xadmin进行操作后,日志记录中的IP总是本地IP:127.0.0.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了