2017-10-14 52 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是的,我的错误;)谢谢! –

相关问题