Django如何开发简单的查询接口详解
作者:628 财经 发布时间:2022-07-06 11:27:57
标签:django,查询,接口
前言
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})
以上的调用方法根据数据名称不同可自行修改。
来源:http://www.000628.com/node/195
0
投稿
猜你喜欢
- 目录实验环境依赖项安装编程实现浏览器有一个可以用于展示网页的窗口代码总结实验环境操作系统:Linux Mint编辑器:vim编程语言:pyt
- 有一些问题可能会遇到同元素多列去重问题,下面介绍一种非常简单效率也很快的做法,用pandas来实现。首先我们看一下数据类型:G1 G2a b
- 我在网上查找了下接口测试相关的资料,大都重点是以数据驱动的形式,将用例维护在文本或表格中,而没有说明怎么样去生成想要的用例,问题:测试接口时
- CSS(叠层样式表)和XSL(可扩展样式语言)都可以定义XML文件的显示,这两种方式有哪些不同以及它们在使用中的具体方法,我们将在本文给予介
- 最近项目中的资产的任务状态频频出现问题,查看日志文件,看代码逻辑,也没发现什么具体的错误,总是过段时间就会出现一个表的字段没有更新的问题,很
- 本文实例讲述了php替换字符串中间字符为省略号的方法。分享给大家供大家参考。具体分析如下:对于一个长字符串,如果你只希望用户看到头尾的部分内
- 在MySQL中,如何实现Top N及M至N段的记录查询?我们可以利用MySQL中SELECT支持的一个子句——LIMIT——来完成这项功能。
- 如下所示:# -*- coding:utf-8 -*-import sysreload(sys)sys.setdefaultencoding
- 向量空间模型VSM:VSM的介绍:一个文档可以由文档中的一系列关键词组成,而VSM则是用这些关键词的向量组成一篇文档,其中的每个分量代表词项
- 遵循Web标准的思想,网页要表现出一种亲和力。那么,针对残障用户来说,其“阅读”器可不能读取图像上传递的信息的。所以我们会采用一种Using
- 静态页面是蜘蛛喜欢的,会得到蜘蛛经常光顾的,以至于网站上的内容会得到搜索引擎更多的收录。这里介绍一个asp伪静态的程序实现方法数据库是acc
- win2000注册表程序 regedt32.exe下面是解决IIS出现Active Server Pages错误&
- Oracle不像SQLServer那样在存储过程中用Select就可以返回结果集,而是通过Out型的参数进行结果集返回的。实际上是利用REF
- 一、读者指引 读者指引帮助你掌握本文的梗概。以免你看了大半才明白这编文章不适合你,给你造成视觉污染。如果你正在用ASP+XML写一些程序,或
- 用最新版本(2.1.0)的pyshp解析shp文件的records时:records = sf.records()如果records里面含有
- 这篇文章主要介绍了Python3如何对urllib和urllib2进行重构,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- 代码如下:<% '=================================================
- 1、场景1)用户输入完网址后,浏览器直接弹出需要输入用户名/密码PS:此时输入用户名密码即可登录,或者直接带着用户名密码访问网站。假设url
- 本文主要介绍了Python3中PyQt5简单实现文件打开及保存,分享给大家,具体如下:# -*- coding: utf-8 -*-# Fo
- 这个问题让我查了许多天才解决,为了避免后面的人重复走弯路,记录下来。问题描述:我在ubuntu 下编译安装了caffe ,在命令行模式下可以