欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django request.META(获取用户ip)

程序员文章站 2022-05-11 18:15:25
...

Django request.META(获取用户ip)

request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent(通常是浏览器的名称和版本号)。 注意,Header信息的完整列表取决于用户所发送的Header信息和服务器端设置的Header信息。

因为 request.META 是一个普通的Python字典,因此当你试图访问一个不存在的键时,会触发一个KeyError异常。 (HTTP header信息是由用户的浏览器所提交的、不应该给予信任的“额外”数据,因此你总是应该好好设计你的应用以便当一个特定的Header数据不存在时,给出一个优雅的回应。)你应该用 try/except 语句,或者用Python字典的 get() 方法来处理这些“可能不存在的键”。

我们可以写一个函数来获取所有的字典项:

def ergodic_meta(request):

    tuple_dict = request.META.items()  #将字典转换成可遍历的元组。

    tuple_dict.sort()   #对元组进行排序,方便查看。

    html = []

    for k, v in tuple_dict:

        html.append('<tr><td>%s</td><td>%s</td></tr>' % (k, v))

    return HttpResponse('<table>%s</table>' % '\n'.join(html))

request.META:包含当前HTTP请求的Headers头部信息, 字典形式。键值KEY都是大写。比如request.META[‘REMOTE_ADDR’]可获取用户远程IP地址。

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

如果用户是正常情况下其字典的KEY键名为‘’REMOTE_ADDR‘’:

request.META[‘REMOTE_ADDR’]
但是有些网站服务器会使用ngix等代理http,或者是该网站做了负载均衡,导致使用remote_addr抓取到的是127.0.0.1,这时使用HTTP_X_FORWARDED_FOR才获得是用户的真实IP。推荐使用以下代码:

if 'HTTP_X_FORWARDED_FOR' in request.META: 
   ip = request.META.get('HTTP_X_FORWARDED_FOR') 
else:
   ip = request.META.get('REMOTE_ADDR')

request.META无法获取到IP

request.META无法获取到IP
参考URL: https://blog.csdn.net/by_side_with_sun/article/details/106190338

问题:
生产环境下,获取request.META.get(“HTTP_X_FORWARDED_FOR”)的时候会得到None,同时获取到request.META.get(“REMOTE_ADDR”)的时候只会得到空字符串,这是因为当你使用nginx反向代理的时候,需要设置header返回:

## nginx配置添加
location / {
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
## 同时脚本里重写获取方式
if request.META.get('HTTP_X_FORWARDED_FOR'):
            ip = request.META.get("HTTP_X_FORWARDED_FOR")
        else:
            ip = request.META.get("HTTP_X_REAL_IP")
相关标签: Python