class tkinfo(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name = _('author'), on_delete=models.CASCADE)
title = models.CharField(max_length=255, verbose_name = u'信息标题')
body = models.TextField()
excerpt = models.CharField(_(u'话题简介'), default='', max_length=2000, blank=True, null = True)
ip_user = models.GenericIPAddressField(unpack_ipv4=True, blank=True, null=True)
ip_user = models.GenericIPAddressField(unpack_ipv4=True, blank=True, null=True) 用这个以前是可以取得用发布信息用户的真实 ip 地址的
最近换了服务器。centos 宝塔 搭建的环境 django2.2 + python3.x + nginx +uwsgi
取得的 ip 地址都是 127.0.0.1 了。 查了半天也没发现哪里有问题? 有知道或遇到过这问题的吗? 多谢
1
hguandl 2021-11-17 16:09:48 +08:00
目测是 nginx 反代时没有设置好 header 。用户的访问通过 nginx 转发到 Django ,IP 当然变成了 localhost 。解决方法是在 nginx 的反代里添加有关来源 IP 的 header ,一般是叫 X-Forwarded-For 或者 X-Real-IP 之类的。网上应该能搜到更具体的教程。
|
2
demo 2021-11-17 16:11:58 +08:00 1
|
3
workg 2021-11-17 16:12:52 +08:00 1
nginx 反带要带上 request ip header 。你直接访问 django 服务是可以拿到 ip 的
|
4
Vegetable 2021-11-17 16:16:22 +08:00
|
5
python30 OP |
7
python30 OP @workg
我以前直接在 centos 里安装 nginx+uwsgi 环境,是可以直接用上面的代码拿到真实 ip 的,最近换到了宝塔面板上的那个 python 环境里就取不到真实 ip 了。 |
8
hguandl 2021-11-17 16:54:06 +08:00
看起来 nginx 做了设置,那可能就是 django 应用里没有处理好。我不了解这个框架,可以参照前面几楼里的说法,查查 django 的资料看看如何处理这个 proxy header 。
|
9
meiyoumingzi6 2021-11-17 19:08:37 +08:00
从 XFF 中获取 ip
|
10
python30 OP @meiyoumingzi6 有演示吗?或者具体说一下? xiexie
|
11
conight 2021-11-18 17:24:49 +08:00
HTTP_CF_CONNECTING_IP -> HTTP_X_FORWARDED_FOR -> REMOTE_ADDR
|