当前位置:脚本大全 > > 正文

django框架详解(Django如何开发简单的查询接口详解)

时间:2021-10-02 01:29:33类别:脚本大全

django框架详解

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

前言

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

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

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

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

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

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 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信息:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 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是否属于客户源站:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • # 打开文件句柄,这部分一定要写到函数以外,如果文件很小并且要支持实时更新,可以写到函数内
  • 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)
  • 接下来定义函数:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 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

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐