Python django框架应用中实现获取访问者ip地址示例


Posted in Python onMay 17, 2019

本文实例讲述了Python django框架应用中实现获取访问者ip地址。分享给大家供大家参考,具体如下:

在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]#所以这里是真实的ip
 else:
  ip = request.META.get('REMOTE_ADDR')#这里获得代理ip
 return 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_addr
if 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_id
 request.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.'})

Python django框架应用中实现获取访问者ip地址示例

Python 相关文章推荐
Python学习笔记_数据排序方法
May 22 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
Python 实现随机数详解及实例代码
Apr 15 Python
python实现快速排序的示例(二分法思想)
Mar 12 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
Python爬虫包BeautifulSoup异常处理(二)
Jun 17 Python
python用for循环求和的方法总结
Jul 08 Python
python多进程间通信代码实例
Sep 30 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
Oct 18 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
python 19个值得学习的编程技巧
Aug 15 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 Python
Python Django框架实现应用添加logging日志操作示例
May 17 #Python
Python实现通过解析域名获取ip地址的方法分析
May 17 #Python
如何用C代码给Python写扩展库(Cython)
May 17 #Python
python实现坦克大战游戏 附详细注释
Mar 27 #Python
六行python代码的爱心曲线详解
May 17 #Python
python使用pygame模块实现坦克大战游戏
Mar 25 #Python
Django如何开发简单的查询接口详解
May 17 #Python
You might like
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
详解vue 命名视图
2019/08/14 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
python如何支持并发方法详解
2020/07/25 Python
Python进行特征提取的示例代码
2020/10/15 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
C语言面试题
2013/05/19 面试题
外贸业务员工作职责
2014/01/06 职场文书
社团文化节邀请函
2014/01/10 职场文书
《乡愁》教学反思
2014/02/18 职场文书
酒店保安领班职务说明书
2014/03/04 职场文书
共产党员承诺书
2014/03/25 职场文书
保护环境的标语
2014/06/09 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
文体活动总结
2015/02/04 职场文书
甲午大海战观后感
2015/06/02 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
民事调解协议书
2016/03/21 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书