Skip to main content
 首页 » 编程设计

在 Google 应用引擎上运行的 Python 应用程序。如何调用 Google Maps API

2025年05月04日31bjzhanghao

我已经设法使用 webapp2 编写了一个简单的 Python 应用程序来向 Google map 发出请求。当我运行本地服务器时,请求有效并且一切正常。我将我的内容上传到谷歌的应用引擎并部署了它。由于环境的变化,当我发出请求时,IP 地址未在我的应用引擎配置中列入白名单。每次我添加地址时,地址都会发生变化。

长话短说:运行 webapp2 的 python 应用程序在本地调用谷歌地图,但部署在 App Engine 上时无法调用。

是否有我应该使用的特定模块/库?我到处都看过,但大多数解决方案都已弃用或要求使用 google.appengine.api,但它似乎没有我需要的东西。

编辑

这是代码。 API 调用在 mapRequests.getMapRequests() 中进行 当您运行本地服务器并访问

http://localhost:8080/map/nearby/?radius=5000&latitudeUser=40.905451&longitudeUser=-74.838134&query=italian

__init__.py

import webapp2 
import json 
import cgi 
import config 
from mapRequests import * 
 
 
class MainPage(webapp2.RequestHandler): 
    def get(self): 
        self.response.headers['Content-Type'] = 'text/plain' 
        self.response.write('**************************') 
 
 
class mapHandler(webapp2.RequestHandler): 
    def get(self,requestType,latitudeUser=None,longitudeUser=None,radius=None,query=None,referenceId=None): 
    finder = mapRequests() 
    self.response.headers['Content-Type'] = 'text/plain' 
 
 
    latitudeUser = cgi.escape(self.request.get('latitudeUser')) 
    longitudeUser = cgi.escape(self.request.get('longitudeUser')) 
    radius = cgi.escape(self.request.get('radius')) 
    query = cgi.escape(self.request.get('query')) 
    referenceId = cgi.escape(self.request.get('referenceId')) 
 
    options = { 
        'nearby' : finder.getMapRequest(latitudeUser,longitudeUser,radius,query), 
        'location' : finder.getRestaurantQuery(referenceId) 
    } 
 
    self.response.write(options[requestType]) 
 
self.response.write(finder.getMapRequest(latitudeUser,longitudeUser,radius,query)) 
 
app = webapp2.WSGIApplication([ 
    ('/', MainPage), 
    ('/map/(nearby|location)/',mapHandler) 
], debug=True) 

ma​​pRequests.py

import json 
import config 
import urllib 
 
class mapRequests(): 
    def __init__(self): 
        self.error = {'status': 'FAIL'} 
        return 
 
    # Get nearby locations within specified radius 
    def getMapRequest(self,latitudeUser,longitudeUser,radius,query): 
 
    .... 
        val = { 
            'location': latitudeUser+','+longitudeUser, 
            'radius': radius, 
            'name': query, 
            'type': 'food', 
            'key': config.GOOGLE_PLACES_KEY 
        } 
        params = urllib.urlencode(val) 
        resp = urllib.urlopen("https://maps.googleapis.com/maps/api/place/nearbysearch/json?%s" % params) 
   return resp.read() 
 
    # Get additional details about a particular location 
    def getRestaurantQuery(self,referenceId): 
        if not referenceId: 
            self.error['referenceId'] = 'MISSING' 
            return(json.dumps(self.error)) 
        return "Looking for a place\n" 

这是在应用引擎上部署和运行时 Google 的响应

{ 
   "error_message" : "This IP, site or mobile application is not authorized to use this API key. Request received from IP address 107.178.195.162, with empty referer", 
   "html_attributions" : [], 
   "results" : [], 
   "status" : "REQUEST_DENIED" 
} 

当我说IP改变时,我的意思是当我在我的开发者控制台中将这里看到的IP添加到白名单中,然后再次运行请求时,它改变了。 尽管唯一的相似之处是 107.178.().() 子网,所以我会像这里提到的一个人一样修改它。我会尽快回复你的。 还有其他建议吗?

请您参考如下方法:

更改您的 API key 以允许 Google App Engine 服务器的整个子网向 Google API 发出请求

在这种情况下将 107.178.0.0/16 添加到您的凭据