Django如何开发简单的查询接口详解


Posted in Python onMay 17, 2019

前言

Django处理json也是一把好手,有时候在工作中各个部门都会提供自己的相关接口,但是信息也只是单方的信息,这时候需要运维将各个部门的信息进行集成,统一出一个查询接口或页面,方便其他部门同事使用,接下来就介绍一下Django如果操作json。

首先介绍一下通过url获取json的方法:

import urllib2

我们的需求是做一个集成的信息查询系统,包括简单的IP信息查询(省份运营商等),以及设备信息(如果是登记在资产管理库中的),还有IP归属(是否是客户源站IP),以及是否为其他部门的存储IP,另外还有错误日志具体信息查询,等等功能,这些功能信息的提供分属于不同的部门,有的是给的url,有的是给的文件,如何将这些功能都揉在一起变成一个接口,确实比较考验逻辑思维,接下来通过代码来具体介绍:

首先我们要分清楚要查询的信息都有什么特征,如果信息非常类似就需要用不同的参数来区分了,如果信息差异明显可以简单通过逻辑顺序判断。

我们先从查询主机名开始写,因为主机名只在资产系统中有登记,是相对固定的数据:

url = "http://3.3.3.3/api/v1/demo..." #先定义了几个url的查询接口,配合我们后面查询来用,当然这些接口吐出的数据得是json格式。 
urlks3 = "http://2.2.2.2/api/v1/demo..."
...
 
 types = ['hostname','pubip','otherinfo','isp','province','city'] # 先定义我们这个接口能吐哪些东西
 if host: # 判断查询的是否为主机名
  hostcheck = str(Ipinfo.objects.values('hostname','pubip','otherinfo').filter(hostname=host)) # 在数据库中查询结果
  if hostcheck: 
   hostcheck = re.sub(r'\'', '\"', hostcheck) # 修查询出的数据改格式为json格式
   maininfo = json.loads(hostcheck) # 将数据库查询出的数据导出到对象
   pubip = maininfo['pubip'] # 这时就可以取出json对应的内容了
   checkipurl = ...+pubip
   data=urllib2.urlopen(checkipurl).read() # 读取某个url中的json内容
   ipinfo = json.loads(data) # 将上一步获取的数据导出到对象
   # 下面是各种赋值,就很随意了
   maininfo['isp'] = ipinfo['info']['isp'] 
   maininfo['province'] = ipinfo['info']['province']
   maininfo['city'] = ipinfo['info']['city']
   # 接下来判断这个请求是否查询了错误日志信息,这个是因为主机名跟错误信息内容比较接近,只能靠参数来判断了  
   if erres:
    erres = re.sub(r' ', '%20', erres)
    checkerreurl = ...
    errepage = urllib2.urlopen(checkerreurl)
    erredata = errepage.read()
    print erredata
    erreinfo = json.loads(erredata)
    maininfo['ch_exp']= erreinfo['ch_exp']
  # 下面是如果查询不到主机信息,就补充空信息避免程序出现异常
  else:
   for item in types:
    maininfo[item] = '-'
  return JsonResponse(maininfo,json_dumps_params={'ensure_ascii':False})

接下来我们查询IP信息:

if ipadd:
  hostcheck = str(Ipinfo.objects.values('hostname','pubip','otherinfo').filter(Q(pubip=ipadd)...)[0:1]) #多个字段查询可以用Q方法 
  if hostcheck:
   hostcheck = re.sub(r'\'', '\"', hostcheck)
   maininfo = json.loads(hostcheck)
   pubip = maininfo['pubip']
   checkipurl = ...+ipadd
   page=urllib2.urlopen(checkipurl)
   data=page.read()
   ipinfo = json.loads(data)
   maininfo['isp'] = ipinfo['info']['isp']
   maininfo['province'] = ipinfo['info']['province']
   maininfo['city'] = ipinfo['info']['city']

期间还有其他的联合查询,逻辑组合可以自行安排。

接下来介绍一下读取json文件并提供查询的方法:

我们的需求是判断IP是否属于客户源站,其中跟客户交互的两个部门都定期导出了客户源站信息文件,但仅仅是文件,而且这两个文件的格式还不太一样

我们要根据这两个文件来查询IP是否属于客户源站:

# 打开文件句柄,这部分一定要写到函数以外,如果文件很小并且要支持实时更新,可以写到函数内
with open('/.../source.json','r') as file_object: # 这个文件是es直接导出的一个大的json,每个k、v都一一对应
 srcinfo = file_object.read()
 srcjson = json.loads(srcinfo)
with open('/.../total.json','r') as tot_object: # 这个文件是一个列表式的json,元素较多,元素中是键值对。
 totinfo = tot_object.read()
 totjson = json.loads(totinfo)

接下来定义函数:

def chsrcip(request):
 exit_flag = [] # 给循环打个退出标签 等下有用
 ip = request.GET.get('ip')
 maininfo = {}
 maininfo['hostname']= '-' # 先给个默认值
 maininfo['otherinfo']= '-'
 if re.search('^(\d+\.\d+\.\d+.\d+)$',ip):
  for item in srcjson:
   for k,v in item.items():
    if ip in v:
     maininfo['hostname']=k
     maininfo['otherinfo']= u'客户源站' 
     exit_flag = 'true' # 由于IP数量庞大,所以找到第一个IP时就停止循环并退出整个for循环,这时候就用到了退出标签。
     break
   if exit_flag: 
    break
  for item in totjson: # 进入第二个for循环查询查询具体的客户名称
   if ip in item['originAddresses']:
    maininfo['hostname']= item['domain'],item['userId']
    maininfo['otherinfo']= u'客户源站'
    break
  return JsonResponse(maininfo,json_dumps_params={'ensure_ascii':False})

以上的调用方法根据数据名称不同可自行修改。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python通过scapy获取局域网所有主机mac地址示例
May 04 Python
pycharm安装图文教程
May 02 Python
对Python3.x版本print函数左右对齐详解
Dec 22 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
Python批量修改图片分辨率的实例代码
Jul 04 Python
Python实现平行坐标图的两种方法小结
Jul 04 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
python集合常见运算案例解析
Oct 17 Python
TensorFLow 变量命名空间实例
Feb 11 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
python 判断字符串当中是否包含字符(str.contain)
Jun 01 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 #Python
学习python分支结构
May 17 #Python
python pygame实现方向键控制小球
May 17 #Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 #Python
Python实现Linux监控的方法
May 16 #Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 #Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 #Python
You might like
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
PHP微信红包API接口
2015/12/05 PHP
PHP微信公众号开发之微信红包实现方法分析
2017/07/14 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
2019/10/23 PHP
firefox下input type="file"的size是多大
2011/10/24 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
理解Koa2中的async&await的用法
2018/02/05 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
详解appium+python 启动一个app步骤
2017/12/20 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
pandas 空的dataframe 插入列名的示例
2018/10/30 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
数控技术应届生求职信
2013/11/13 职场文书
自立自强的名人事例
2014/02/10 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
社区平安建设方案
2014/05/25 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
主持人大赛开场白
2015/05/29 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python