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中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
基于python编写的微博应用
Oct 17 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 Python
用Django实现一个可运行的区块链应用
Mar 08 Python
转换科学计数法的数值字符串为decimal类型的方法
Jul 16 Python
PyQt5实现类似别踩白块游戏
Jan 24 Python
Python实现爬取马云的微博功能示例
Feb 16 Python
pandas 层次化索引的实现方法
Jul 06 Python
python每天定时运行某程序代码
Aug 16 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
Django利用AJAX技术实现博文实时搜索
May 06 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
Apr 06 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
hadoop常见错误以及处理方法详解
2013/06/19 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
PHP使用PDO操作sqlite数据库应用案例
2019/03/07 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
vue兄弟组件传递数据的实例
2018/09/06 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
webpack4 optimization使用总结
2019/11/10 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
Python中random模块用法实例分析
2015/05/19 Python
用Python写一个无界面的2048小游戏
2016/05/24 Python
全面了解python字符串和字典
2016/07/07 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
Python 私有化操作实例分析
2019/11/21 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
英语硕士生求职简历的自我评价
2013/10/15 职场文书
代理商会议邀请函
2014/01/27 职场文书
煤矿机修工岗位职责
2014/02/07 职场文书
人事文员岗位职责
2014/02/16 职场文书
《我要的是葫芦》教学反思
2014/02/23 职场文书
2014年公司工作总结
2014/11/22 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL