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


猜你喜欢
- 昨天解决完数据库跨权限操作后,今天打开项目突然报错了,然后重启数据库时,报 ERROR! MySQL server PID file cou
- 在大型商业应用中,数据的异地容灾备份十分重要,也必不可少。笔者根据自己的实践经验,设计了一套简洁地实现异地数据自动备份的方法,可供数据库管理
- 一,JS对象<!DOCTYPE html><html><head><meta charset=&q
- 子节点部分选中时父节点也选中如果需求是:选中任何一个子节点都默认选择父节点,怎么办?其实,element-ui也提供了方案,常规下,如果子节
- 摘要:本文主要学习了如何使用DBUtils在Java代码中更方便的操作数据库。概述DBUtils是Java编程中的数据库操作实用工具,小巧简
- 问题描述当前环境win10,python_3.6.1,64位。在windows下,在dos中运行pip install Scrapy报错:b
- 安装SDK:pip install baidu-aip如果在pycharm里也可以在setting----Project Interpret
- 一、 背景由于公司业务需要动态配置一些存储过程来生成数据,之前尝试过使用jpa来完成,或多或少都存在一些问题,最后使用了spring的Jdb
- 例子class A(object): def foo(self,x): print "exe
- /**//// <summary> /// 生成带CDATA的节点 /// </summary> /// <p
- COOKIE函数库:cookie.inc.php3 <?php if (!isset($__cookie_inc__)){ $__co
- 新写自己的Threading类class MyThread(threading.Thread):#我的Thread类 判断流程结束没 用于o
- 本文实例讲述了Python排序搜索基本算法之希尔排序。分享给大家供大家参考,具体如下:希尔排序是插入排序的扩展,通过允许非相邻的元素进行交换
- 实际需求中,需要对某张表某字段里面的内容进行批量替换,普通的思考流程如下:SELECT出来str_replace替换UPDATE写入实际这样
- HTML 5 和 XHTML 2规范草稿公布以来,一直存在很大的争议。HTML 5是由包括Google、Mirosoft、Mozilla、O
- 1、Select元素2、定位select方法一:二次定位先定位 select 框,再定位 select 里的选项但有时候选项是无法定位的,所
- 模型的恢复对于的模型的恢复来说,需要首先恢复模型的整个图文件,之后从图文件中读取相应的节点信息。存储的模型文件包括四个子文件,如下:&nbs
- 前言我们的游戏资源处理工具是Python实现的,功能包括csv解析,UI材质处理,动画资源解析、批处理,Androd&iOS自动打包
- 在写代码的时候,往往会漏掉日志这个关键因素,导致功能在使用的时候出错却无法溯源。其实,只需要写一个非常简单的日志装饰器,我们就能大大提升排查
- 在Python中存储数据到文件中时,简单的做法是调用open函数执行文件写入操作,但是这样做的话,当我们要重新读取文件内容时,就会出现类型不