Django如何開發(fā)簡單的查詢接口詳解
前言
Django處理json也是一把好手,有時候在工作中各個部門都會提供自己的相關(guān)接口,但是信息也只是單方的信息,這時候需要運維將各個部門的信息進行集成,統(tǒng)一出一個查詢接口或頁面,方便其他部門同事使用,接下來就介紹一下Django如果操作json。
首先介紹一下通過url獲取json的方法:
import urllib2
我們的需求是做一個集成的信息查詢系統(tǒng),包括簡單的IP信息查詢(省份運營商等),以及設(shè)備信息(如果是登記在資產(chǎn)管理庫中的),還有IP歸屬(是否是客戶源站IP),以及是否為其他部門的存儲IP,另外還有錯誤日志具體信息查詢,等等功能,這些功能信息的提供分屬于不同的部門,有的是給的url,有的是給的文件,如何將這些功能都揉在一起變成一個接口,確實比較考驗邏輯思維,接下來通過代碼來具體介紹:
首先我們要分清楚要查詢的信息都有什么特征,如果信息非常類似就需要用不同的參數(shù)來區(qū)分了,如果信息差異明顯可以簡單通過邏輯順序判斷。
我們先從查詢主機名開始寫,因為主機名只在資產(chǎn)系統(tǒng)中有登記,是相對固定的數(shù)據(jù):
url = "http://3.3.3.3/api/v1/demo..." #先定義了幾個url的查詢接口,配合我們后面查詢來用,當然這些接口吐出的數(shù)據(jù)得是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)) # 在數(shù)據(jù)庫中查詢結(jié)果
if hostcheck:
hostcheck = re.sub(r'\'', '\"', hostcheck) # 修查詢出的數(shù)據(jù)改格式為json格式
maininfo = json.loads(hostcheck) # 將數(shù)據(jù)庫查詢出的數(shù)據(jù)導(dǎo)出到對象
pubip = maininfo['pubip'] # 這時就可以取出json對應(yīng)的內(nèi)容了
checkipurl = ...+pubip
data=urllib2.urlopen(checkipurl).read() # 讀取某個url中的json內(nèi)容
ipinfo = json.loads(data) # 將上一步獲取的數(shù)據(jù)導(dǎo)出到對象
# 下面是各種賦值,就很隨意了
maininfo['isp'] = ipinfo['info']['isp']
maininfo['province'] = ipinfo['info']['province']
maininfo['city'] = ipinfo['info']['city']
# 接下來判斷這個請求是否查詢了錯誤日志信息,這個是因為主機名跟錯誤信息內(nèi)容比較接近,只能靠參數(shù)來判斷了
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']
# 下面是如果查詢不到主機信息,就補充空信息避免程序出現(xiàn)異常
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']
期間還有其他的聯(lián)合查詢,邏輯組合可以自行安排。
接下來介紹一下讀取json文件并提供查詢的方法:
我們的需求是判斷IP是否屬于客戶源站,其中跟客戶交互的兩個部門都定期導(dǎo)出了客戶源站信息文件,但僅僅是文件,而且這兩個文件的格式還不太一樣
我們要根據(jù)這兩個文件來查詢IP是否屬于客戶源站:
# 打開文件句柄,這部分一定要寫到函數(shù)以外,如果文件很小并且要支持實時更新,可以寫到函數(shù)內(nèi)
with open('/.../source.json','r') as file_object: # 這個文件是es直接導(dǎo)出的一個大的json,每個k、v都一一對應(yīng)
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)
接下來定義函數(shù):
def chsrcip(request):
exit_flag = [] # 給循環(huán)打個退出標簽 等下有用
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數(shù)量龐大,所以找到第一個IP時就停止循環(huán)并退出整個for循環(huán),這時候就用到了退出標簽。
break
if exit_flag:
break
for item in totjson: # 進入第二個for循環(huán)查詢查詢具體的客戶名稱
if ip in item['originAddresses']:
maininfo['hostname']= item['domain'],item['userId']
maininfo['otherinfo']= u'客戶源站'
break
return JsonResponse(maininfo,json_dumps_params={'ensure_ascii':False})
以上的調(diào)用方法根據(jù)數(shù)據(jù)名稱不同可自行修改。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關(guān)文章
python利用pyttsx3 API實現(xiàn)文本轉(zhuǎn)語音處理
這篇文章主要為大家詳細介紹了Python如何利用pyttsx3 API實現(xiàn)文本轉(zhuǎn)語音處理,文中有詳細的示例代碼,感興趣的小伙伴可以跟隨小編一起學習一下2023-06-06
封裝?Python?時間處理庫創(chuàng)建自己的TimeUtil類示例
這篇文章主要為大家介紹了封裝?Python?時間處理庫創(chuàng)建自己的TimeUtil類示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2023-05-05
python scipy.spatial.distance 距離計算函數(shù) ?
本文主要介紹了python scipy.spatial.distance 距離計算函數(shù),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
python GUI庫圖形界面開發(fā)之PyQt5線程類QThread詳細使用方法
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5線程QThread類詳細使用方法,需要的朋友可以參考下2020-02-02
Python中collections.Counter()的具體使用
本文主要介紹了Python中collections.Counter()的具體使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07

