Django集成多源JSON数据构建统一查询接口实战

Ryan
Ryan
发布时间:2026-10-13| 6人浏览过
原创

本文详解如何利用Django框架整合来自不同部门的多源JSON数据,构建统一的查询接口。通过解析URL返回的JSON及本地JSON文件,结合数据库查询与逻辑判断,实现IP、主机名及客户源站信息的综合检索,为运维提供高效的数据集成方案。

前言

Django集成多源JSON数据构建统一查询接口实战

Django在处理JSON数据方面表现优异。在实际工作中,各部门往往独立提供各自的接口,信息呈现孤立状态。此时,运维团队需要将这些分散的信息进行集成,统一封装成一个查询接口或页面,以便其他部门同事便捷使用。本文将介绍如何在Django中操作JSON以实现这一目标。

通过URL获取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文件进行查询

接下来介绍读取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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。