django获取客户ip

1 def get_client_ip(request):
2     x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
3     if x_forwarded_for:
4         ip = x_forwarded_for.split(',')[-1].strip()
5     else:
6         ip = request.META.get('REMOTE_ADDR')
7     return ip

 

使用django来获取用户访问的IP地址

request.META['REMOTE_ADDR']


服务器会使用ngix等代理http,或者是该网站做了负载均衡,使用remote_addr抓取到的是1270.0.1,
使用HTTP_X_FORWARDED_FOR才获得真实IP。
 

转载于:https://www.cnblogs.com/liujuejun/p/10508333.html

获取请求的真实 IP 地址在 Web 开发中非常重要,尤其是在需要进行用户地理位置分析、防止恶意攻击等情况时。由于网络架构的多样性(例如存在代理服务器或负载均衡器),直接从 HTTP 请求头中读取客户端 IP 可能并不总是准确的。下面是几种常见的方式及注意事项来帮助你正确获得真实的IP地址。 ### 1. 直接从 `REMOTE_ADDR` 获取 最简单的情况是从环境变量 `REMOTE_ADDR` 或者相应框架提供的类似属性中直接获取用户的IP地址。这种方式通常适用于没有经过任何中间件转发的情况下。 ```python # Flask 示例 from flask import request def get_ip(): return request.remote_addr ``` 但是要注意的是,在有反向代理(如 Nginx/Apache)或者其他前端设备介入的时候,这个值往往只是最后一个接触的应用层网关的 IP ,而不是最终发起请求者的实际物理位置标识。 ### 2. 解析 X-Forwarded-For 头部信息 当请求经过多个HTTP代理传递到目标服务器之前,它们会在原始包基础上附加额外的信息以便追踪来源链路。“X-Forwarded-For”就是这样一个标准化头部字段,它包含了每一个跳跃点之间的公共互联网协议版本4(CPV4)/6(IPV6)地址列表。 ```http X-Forwarded-For: client-ip, proxy1-ip, proxy2-ip... ``` 为了安全起见,应该只信任来自受控范围内的上游节点所提供的该类标头内容,并按照一定规则解析出正确的客户机位址: * 最左边的第一个非空项通常是真实用户的公网出口; * 剔除内部私有段落(10.x.x.x / 172.16.x.x - 172.31.x.x / 192.168.x.x),因为这些很可能属于不可信源端口映射后的结果。 示例 Python 代码: ```python import re def extract_real_ip(xff): ips = xff.split(',') # Remove leading/trailing whitespace and filter out private IPs. cleaned_ips = [ ip.strip() for ip in ips if not _is_private(ip.strip()) ] return next(iter(cleaned_ips), None) def _is_private(ip_address): """Check whether an IP address belongs to a reserved/private range.""" privates = ['^10\.', '^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-1]\.', '^192\.168\.', '^::1$', '^fc00:', '^fe80:', '^[fF]d'] pattern = r'|'.join(privates) match = re.match(pattern, ip_address) return bool(match) if __name__ == '__main__': print(extract_real_ip("192.168.1.1, 54.36.148.22")) print(extract_real_ip("10.0.0.1, 203.0.113.1")) >>> Output: >>> 54.36.148.22 >>> 203.0.113.1 ``` 请注意,对于部署在外网环境中应用程序来说,最好配置好你的 web server(像 NGINX)使其能够设置正确的 `X-Forwarded-*` headers 并且仅允许已知可信的服务实例去更改这类关键性的元数据条目。 ### 3. 使用 Cloudflare Meta Headers 如果你正在使用Cloudflare这样的CDN服务提供商,则还可以依赖于他们特供的一系列meta header,比如 `CF-Connecting-IP`, 它们会自动为你提供穿透 CDN 层面到达原生访客机器的确切连接点坐标。 ```python # Django 中的例子 def get_client_ip(request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') cf_connecting_ip = request.META.get('HTTP_CF_CONNECTING_IP') if cf_connecting_ip: return cf_connecting_ip elif x_forwarded_for: return extract_real_ip(x_forwarded_for).split(',')[0] else: return request.META.get('REMOTE_ADDR') or '' ``` 以上方法涵盖了多种情况下的解决方案,具体选择哪一种取决于项目的实际情况和技术栈特点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值