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中使用item()方法遍历字典的例子
Aug 26 Python
pymongo实现多结果进行多列排序的方法
May 16 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
Python简单读取json文件功能示例
Nov 30 Python
Python决策树分类算法学习
Dec 22 Python
python中多个装饰器的执行顺序详解
Oct 08 Python
python+selenium实现简历自动刷新的示例代码
May 20 Python
TensorFlow:将ckpt文件固化成pb文件教程
Feb 11 Python
python实现一个猜拳游戏
Apr 05 Python
Python pip 常用命令汇总
Oct 19 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 Python
python制作微博图片爬取工具
Jan 16 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版)
2006/10/09 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
2013/11/07 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
jquery实现的放大镜效果示例
2020/02/24 jQuery
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
深入浅析python继承问题
2016/05/29 Python
python基础教程之匿名函数lambda
2017/01/17 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
如何定义TensorFlow输入节点
2020/01/23 Python
keras 多gpu并行运行案例
2020/06/10 Python
Python如何读取、写入JSON数据
2020/07/28 Python
python单元测试框架pytest的使用示例
2020/10/07 Python
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
九一八事变纪念日演讲稿
2014/09/14 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
机关作风建设自查报告
2014/10/22 职场文书
2014年客房部工作总结
2014/11/22 职场文书
工作简历自我评价
2015/03/11 职场文书
电工实训心得体会
2016/01/14 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL