当前位置: 首页 > 编程笔记 >

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

姜经武
2023-03-14
本文向大家介绍Django如何开发简单的查询接口详解,包括了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})

以上的调用方法根据数据名称不同可自行修改。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。

 类似资料:
  • 本文向大家介绍django开发post接口简单案例,获取参数值的方法,包括了django开发post接口简单案例,获取参数值的方法的使用技巧和注意事项,需要的朋友参考一下 项目环境:python3.6,django2.1 接口功能: 将传入参数a和b字符串相加,返回结果 1.新建一个django项目 2.在django-test/Post/Post 文件夹下 创建一个view.py文件 3.在vi

  • 问题内容: 在进行Django 开发时,我倾向于使用SQLite,但是在实时服务器上,通常需要更强大的功能(例如MySQL / PostgreSQL)。同样,对Django设置也有其他更改:不同的日志记录位置/强度,媒体路径等。 你如何管理所有这些更改,以使部署变得简单,自动化? 问题答案: 如果你希望手动进行操作,则我先前的答案仍然适用: 我有多个设置文件。 -特定于主机的配置,例如数据库名称,

  • 本文向大家介绍php-app开发接口加密详解,包括了php-app开发接口加密详解的使用技巧和注意事项,需要的朋友参考一下 自己平时工作中用到的一套接口加密规则,记录下来以后用: 客户端代码demo: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍Python接口开发实现步骤详解,包括了Python接口开发实现步骤详解的使用技巧和注意事项,需要的朋友参考一下 一、操作步骤 1. 导入:import flask,json 2. 实例化:api = flask.Flask(__name__) 3. 定义接口访问路径及访问方式:@api.route('/index',methods=['get/post/PUT/DELETE'])

  • 这部分文档包含了 Requests 所有的接口。对于 Requests 依赖的外部库部分,我们在这里介绍最重要的部分,并提供了规范文档的链接。 主要接口 Requests 所有的功能都可以通过以下 7 个方法访问。它们全部都会返回一个 对象的实例。 requests.request(method, url, **kwargs) Constructs and sends a . 参数: method

  • 我得到一个错误: CORS策略阻止了在“https://api.example.com/graphql”从来源“chrome-search://local-ntp”获取:对飞行前请求的响应没有通过访问控制检查:请求的资源上没有“access-control-allog-orgin”标头。如果一个不透明的响应满足您的需要,请将请求的模式设置为“no-cors”,以便在禁用CORS的情况下获取资源。