亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django如何開發簡單的查詢接口詳解

發布時間:2020-09-06 20:55:02 來源:腳本之家 閱讀:165 作者:628 財經 欄目:開發技術

前言

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})

以上的調用方法根據數據名稱不同可自行修改。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

襄城县| 遂川县| 博爱县| 乐安县| 乌什县| 莱西市| 探索| 沅陵县| 定西市| 罗定市| 拜泉县| 双柏县| 河北区| 乌兰察布市| 新闻| 庆元县| 高邮市| 高密市| 乐昌市| 永德县| 湖北省| 灌南县| 方城县| 德化县| 康平县| 河间市| 砚山县| 集贤县| 北川| 阳谷县| 敖汉旗| 西畴县| 牡丹江市| 沧源| 青岛市| 正宁县| 文化| 潢川县| 黑水县| 玉环县| 田东县|