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去除文件中空格、Tab及回车的方法
Apr 12 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
Jul 07 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
Dec 17 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 Python
Python socket非阻塞模块应用示例
Sep 12 Python
TensorFlow加载模型时出错的解决方式
Feb 06 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
python TCP包注入方式
May 05 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 18 Python
python3使用diagrams绘制架构图的步骤
Apr 08 Python
Python Django模型详解
Oct 05 Python
python计算列表元素与乘积详情
Aug 05 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中smarty模板条件判断用法实例
2015/06/11 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
JS实现FLASH幻灯片图片切换效果的方法
2015/03/04 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
python调用百度语音REST API
2018/08/30 Python
python找出完数的方法
2018/11/12 Python
pandas计数 value_counts()的使用
2019/06/24 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
python动态视频下载器的实现方法
2019/09/16 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
5款实用的python 工具推荐
2020/10/13 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
污水厂厂长岗位职责
2014/01/04 职场文书
团支部建设方案
2014/05/02 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
党员对照检查材料
2014/09/22 职场文书
神农溪导游词
2015/02/11 职场文书
Python基础知识学习之类的继承
2021/05/31 Python
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL