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中利用sqrt()方法进行平方根计算的教程
May 15 Python
如何在Python函数执行前后增加额外的行为
Oct 20 Python
深入理解NumPy简明教程---数组1
Dec 17 Python
python实现二叉树的遍历
Dec 11 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
python爬虫添加请求头代码实例
Dec 28 Python
django修改models重建数据库的操作
Mar 31 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
Apr 08 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 Python
Python Django路径配置实现过程解析
Nov 05 Python
python3列表删除大量重复元素remove()方法的问题详解
Jan 04 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下实现伪 url 的超简单方法[转]
2007/09/24 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
收集的10个免费的jQuery相册
2011/02/26 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
JavaScript工具库MyTools详解
2020/01/01 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
利用python库在局域网内传输文件的方法
2018/06/04 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
2020/02/28 Python
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
建筑设计所实习生自我鉴定
2013/09/25 职场文书
建筑行业的大学生自我评价
2013/12/08 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
文秘求职信范文
2014/04/10 职场文书
2014年连锁店圣诞节活动方案
2014/12/09 职场文书
男生贾里读书笔记
2015/06/30 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server
一篇文章弄懂Python中的内建函数
2021/08/07 Python
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python