在django官方文档中有一段对request.META的解释:

HttpRequest.META
A standard Python dictionary containing all available HTTP headers. Available headers depend on the client
and server, but here are some examples:
•CONTENT_LENGTH – The length of the request body (as a string).
•CONTENT_TYPE – The MIME type of the request body.
•HTTP_ACCEPT – Acceptable content types for the response.
•HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
•HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
•HTTP_HOST – The HTTP Host header sent by the client.
•HTTP_REFERER – The referring page, if any.
•HTTP_USER_AGENT – The client’s user-agent string.
•QUERY_STRING – The query string, as a single (unparsed) string.
•REMOTE_ADDR – The IP address of the client.
•REMOTE_HOST – The hostname of the client.
•REMOTE_USER – The user authenticated by the Web server, if any.
•REQUEST_METHOD – A string such as "GET" or "POST".
•SERVER_NAME – The hostname of the server.
•SERVER_PORT – The port of the server (as a string).
With the exception of CONTENT_LENGTH and CONTENT_TYPE, as given above, any HTTP headers in the
request are converted to META keys by converting all characters to uppercase, replacing any hyphens with
underscores and adding an HTTP_ prefix to the name. So, for example, a header called X-Bender would be
mapped to the META key HTTP_X_BENDER.
Note that runserver strips all headers with underscores in the name, so you won’t see them in META. This
prevents header-spoofing based on ambiguity between underscores and dashes both being normalizing to under-
scores in WSGI environment variables. It matches the behavior of Web servers like Nginx and Apache 2.4+.

然后我们来打印一下其中的条目进行验证:

request_meta = request.META
info = []
for k, v in request_meta.items():info.append(k)print info
>>>
['wsgi.version', 'RUN_MAIN', 'HTTP_REFERER', 'HTTP_HOST', 'SERVER_PROTOCOL', 'SERVER_SOFTWARE', 'SCRIPT_NAME', 'LESSOPEN', 'SSH_CLIENT', 'REQUEST_METHOD', 'LOGNAME', 'USER', 'HOME', 'QUERY_STRING', 'PATH', 'MYSQL_DATABASE_URI', 'wsgi.errors', 'TERADATA_JACKAL_URI', 'LANG', 'TERM', 'SHELL', 'TZ', 'HTTP_COOKIE', 'J2REDIR', 'REMOTE_ADDR', 'SHLVL', 'wsgi.url_scheme', 'HTTP_VIA', 'SERVER_PORT', 'wsgi.file_wrapper', 'JAVA_HOME', 'CONTENT_LENGTH', 'HTTP_CONNECTION', 'XDG_RUNTIME_DIR', 'TERADATA_PASSWORD', 'PYTHONPATH', 'COMP_WORDBREAKS', 'VIRTUAL_ENV', u'CSRF_COOKIE', 'J2SDKDIR', 'wsgi.input', 'HTTP_USER_AGENT', 'PS1', 'wsgi.multithread', 'HTTP_UPGRADE_INSECURE_REQUESTS', 'HTTP_CACHE_CONTROL', 'XDG_SESSION_ID', '_', 'HTTP_ACCEPT', 'DERBY_HOME', 'SSH_CONNECTION', 'LESSCLOSE', 'SERVER_NAME', 'GATEWAY_INTERFACE', 'HTTP_X_FORWARDED_FOR', 'SSH_TTY', 'OLDPWD', 'wsgi.multiprocess', 'HTTP_ACCEPT_LANGUAGE', 'wsgi.run_once', 'PWD', 'DJANGO_SETTINGS_MODULE', 'CONTENT_TYPE', 'TERADATA_SIMBA_URI', 'MAIL', 'LS_COLORS', 'REMOTE_HOST', 'HTTP_ACCEPT_ENCODING', 'PATH_INFO']

通常访问者的ip会包含在上边的键值对中,我们可以通过一下方式获取ip:

通常访问者的IP就在其中,所以我们可以用下列方法获取用户的真实IP:#X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。
def get_ip(request):x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')if x_forwarded_for:ip = x_forwarded_for.split(',')[0]#所以这里是真实的ipelse:ip = request.META.get('REMOTE_ADDR')#这里获得代理ipreturn ip

结合上一篇的日志模块,可以实现记录登陆用户的ip信息:

        remote_info = ''x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')if x_forwarded_for:remote_info = 'HTTP_X_FORWARDED_FOR:' + x_forwarded_for.split(',')[0]remote_addr = request.META.get('REMOTE_ADDR')if remote_addr:remote_info += ' REMOTE_ADDR:' + remote_addrif pass_auth:user.last_login_at = timezone.now()try:user.save()except Exception, msg:return JsonResponse({'result': 'Error', 'message': str(msg)})request.session['user_id'] = user_idrequest.session.set_expiry(9000)logger.info('[Success] '+ user_id+' has logged in! '+remote_info)return JsonResponse({'result': 'Success', 'message': 'Login successfully.'})else:logger.warning('[Failed] '+ user_id + ' failed to login! '+remote_info)return JsonResponse({'result': 'Error', 'message': 'Username or Password is incorrect.'})

本文转载https://blog.csdn.net/lockey23/article/details/80903563

Django获取用户的ip相关推荐

  1. DJANGO获取用户访问IP

    使用django来获取用户访问的IP地址,如果用户是正常情况下 1 request.META['REMOTE_ADDR'] 可以获得用户的IP地址.但是有些网站服务器会使用ngix等代理http,或者 ...

  2. php 获取用户的IP、地址、来源

    js方法获取用户的 ip 和 地址 <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> ...

  3. PHP获取用户真实IP地址

    PHP获取用户真实IP地址 <?phpfunction getRealIpAddr() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip=$_SER ...

  4. nginx反向代理获取用户真实ip

    nginx做反向代理时,默认的配置后端获取到的ip都是来自于nginx,如何转发用户的真实ip到后端程序呢?如是是java后端,用request.getRemoteAddr();获取到的是nginx的 ...

  5. php获取客户端ip端口,Phpwind获取用户真实IP

    Phpwind获取用户真实IP 使用nat123端口映射后,可能会遇到phpwind网站无法获取用户真实IP的情况,对应解决方法有下. phpwind8.5的方法: 修改 /require/commo ...

  6. nginx利用反向代理实现获取用户真实ip

    我们访问互联网上的服务时,大多数时,客户端并不是直接访问到服务端的,而是客户端首先请求到反向代理,反向代理再转发到服务端实现服务访问,通过反向代理实现路由/负载均衡等策略.这样在服务端拿到的客户端IP ...

  7. JAVA:获取用户访问ip地址

    获取用户真实IP地址:不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址: 可是,如果通过了多级反向代理的话,X-Forwarded-For的值 ...

  8. PHP获取用户访问IP地址的5种方法

    PHP获取用户访问IP地址的5种方法: //方法1: <?php                                                                 ...

  9. 使用nginx代理的情况下获取用户真实IP

    ##1.背景知识 1.1. 前提知识点: 还有nginx中的几个变量: remote_addr 代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站 ...

最新文章

  1. 沃通免费SSL证书申请指南
  2. MySQLMySql免安装版安装配置
  3. php httpclient.class.php,php实现httpclient类示例
  4. 使用brew安装Logstash(Mac)
  5. java 变量的调用方法_java类变量的调用方式
  6. 控制文件夹递归深度_TensorFlow、Pytorch和Keras的样例资源(深度学习初学者必须收藏)...
  7. Ettus Research USRP B200/B210 simple case
  8. 如何使用imageJ绘制热图 伪彩色
  9. 用技术去掉搜索引擎中的死链接
  10. Ubuntu16.04 安装Redis哨兵模式
  11. 记:《洛克菲勒留给儿子的38封信》-- 8
  12. 做数据必知的十本书,你读过几本?
  13. Docker容器 Dead 状态分析
  14. DTC品牌如何冷启动?
  15. uva 11021 Tribbles 麻球繁衍 概率
  16. 经典文献阅读之--SuMa++
  17. 一夜狼人杀:千万不要沉默不语,参与游戏聊自己的角色
  18. 《uCOS51移植心得》---七年前之《快快乐乐跟我学51单片机操作系统和IP栈》
  19. JAVA初/中/高级程序员必须知道的知识
  20. 2008系统服务器日志在哪里,windows-server-2008 – 如何将Windows Server 2008事件日志发送到syslog服务器?...

热门文章

  1. ctf/web源码泄露及利用办法【总结中】
  2. 用Python实现给图片变换颜色
  3. 白岩松: 走得太远,别忘了当初为什么出发
  4. 2015 - 2016
  5. java Unsafe获取实例详细解析
  6. ROS 消息过滤器MessageFilter
  7. kafka吞吐量测试
  8. 笔记本电脑合上盖子外接显示器依然能够显示设置
  9. mysql fast shutdown_MySQL参数解析 innodb_fast_shutdown
  10. 单目摄像机测距(python+opencv)