运行在谷歌应用程序引擎上的Python应用程序。如何调用谷歌地图API?
我已经设法编写了一个简单的Python应用程序,使用webapp2向Google maps发出请求。当我运行本地服务器时,请求是有效的,一切正常。我将我的内容上传到谷歌的应用程序引擎并部署了它。由于环境的变化,当我发出请求时,IP地址不会在我的应用程序引擎配置中显示为白色。每次我添加地址时,地址都会更改 长话短说:运行webapp2的python应用程序在本地调用google地图,但在应用程序引擎上部署时无法调用。 是否有我应该使用的特定模块/库?我到处都找过,但大多数解决方案都不推荐使用,或者要求使用google.appengine.api,它似乎没有我所需要的 编辑 这是密码。API调用是在mapRequests.getMapRequests()中进行的 当您运行本地服务器并访问 \uuuu init\uuuuu.py运行在谷歌应用程序引擎上的Python应用程序。如何调用谷歌地图API?,python,google-maps,google-app-engine,Python,Google Maps,Google App Engine,我已经设法编写了一个简单的Python应用程序,使用webapp2向Google maps发出请求。当我运行本地服务器时,请求是有效的,一切正常。我将我的内容上传到谷歌的应用程序引擎并部署了它。由于环境的变化,当我发出请求时,IP地址不会在我的应用程序引擎配置中显示为白色。每次我添加地址时,地址都会更改 长话短说:运行webapp2的python应用程序在本地调用google地图,但在应用程序引擎上部署时无法调用。 是否有我应该使用的特定模块/库?我到处都找过,但大多数解决方案都不推荐使用,或者
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)
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"
mapRequests.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)
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"
这就是谷歌在应用程序引擎上部署和运行时的响应
{
"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密钥,允许google app engine服务器的整个子网向google API发出请求
在本例中,将107.178.0.0/16添加到您的凭证中查看此链接,我发现Google Maps Coordinate API,如果它在2016年1月未被设置为弃用,这将非常有用。我猜谷歌还有其他选择。有人知道它在哪里或是什么吗?谷歌地图引擎API呢。列表中它下面的那个。没关系,我也不赞成。奇怪。我注册了app engine的免费试用来调查这一点。请在防火墙规则部分给我一个提示,你不能只添加子网(我假设虽然ip添加更改,但它在一个子网上)并允许它通过tcp端口80吗?您将需要发出出站REST请求。我看到了您所描述的内容,但设置起来有点困难。您知道如何将其设置为IP的范围吗?否则,我将继续使用网络设置。请发布您的API调用,以便我们能够准确地看到您的尝试。你说的“每次我加地址,地址都会改变”是什么意思?是报告了错误还是得到了意外的结果?我想他的意思是他正在调用google的RESTAPI,他们使用DNS负载平衡来返回不同的IP。因此,在防火墙中没有一个IP可以让他的http流量通过。尝试ping google.com多次,您会注意到ip地址没有更新到相同的位置@JoshAllemon解释得比我好。我认为您需要将API键放在请求的末尾。我在val字典的mapRequests中这样做是作为“键”。由于明显的原因,不打算显示它,但它位于另一个名为config的文件中。