2017-10-14 46 views
0

我有一個Python API,我試圖調用並打印給定ip範圍的城市名稱。 Python API中看起來如下:從另一個程序調用python API

import datetime as dt 

from flask import Flask, jsonify, request 



class IpRangeSearch: 

    RANGES = { 
     'Tokyo': [ 
      {'start': '10.10.0.0', 'end': '10.10.255.255'}, 
      {'start': '192.168.1.0', 'end': '192.168.1.255'}, 
     ], 
     'Paris': [ 
      {'start': '10.12.0.0', 'end': '10.12.255.255'}, 
      {'start': '172.16.10.0', 'end': '172.16.11.255'}, 
      {'start': '192.168.2.0', 'end': '192.168.2.255'}, 
     ] 
    } 

    def __init__(self): 
     pass 

    def get_city(self, ip): 
     for city, ipranges in self.RANGES.items(): 
      for iprange in ipranges: 
       if ip >= iprange['start'] and ip <= iprange['end']: 
        return city 


app = Flask(__name__) 
ip_range_search = IpRangeSearch() 



@app.route('/ip_city/<ip>') 
def ip_city(ip): 

    return jsonify({'city': ip_range_search.get_city(ip)}) 


if __name__ == '__main__': 
    app.run(host='0.0.0.0') 

我打電話從其他Python程序的API:

import json 
import oauth2 as oauth 
import requests 

response = requests.get("http://0.0.0.0:5000/ip_city/10.12.1.1") 

print(response.status_code) 
print(response.content) 

理想情況下,上面的代碼應該打印:

200 
{ 
    "city": Paris 
} 

但其打印:

200 
{ 
    "city": null 
} 

我是n不知道爲什麼,但是當我嘗試運行API代碼將json結構解析爲獨立函數時 - 代碼以正確的格式打印輸出。

我在做什麼錯?

+1

我覺得'get_city()'想要_return_城市,而不是_print_它。 –

+0

你還沒有處理它找不到條目的情況。在這種情況下,您需要返回一個值。如果您希望在您的案例中找到值,則需要調試您的功能。 –

+0

我在shell中運行了這段代碼,它確實返回了'Paris',所以基本代碼看起來很好。也許網站腳手架存在一些問題?嘗試將ip添加到返回的jsonify字典中,以便您可以看到它顯示並確保正確接收它。 –

回答

0

ip_city函數返回json對象,只需調用requests對象的json功能

response = requests.get("http://0.0.0.0:5000/ip_city/10.12.1.1").json() 

UPD:

也許IP在你的函數沒有發現,你的函數返回None

只需加上else s評論,並檢查它。

def get_city(ip): 
    for city, ipranges in RANGES.items(): 
     for iprange in ipranges: 
      if ip >= iprange['start'] and ip <= iprange['end']: 
       return city 
    return 'IP not found' 
+0

@PaulRooney是的,我的錯誤;)謝謝! –

相關問題