运行在谷歌应用程序引擎上的Python应用程序。如何调用谷歌地图API?

运行在谷歌应用程序引擎上的Python应用程序。如何调用谷歌地图API?,python,google-maps,google-app-engine,Python,Google Maps,Google App Engine,我已经设法编写了一个简单的Python应用程序,使用webapp2向Google maps发出请求。当我运行本地服务器时,请求是有效的,一切正常。我将我的内容上传到谷歌的应用程序引擎并部署了它。由于环境的变化,当我发出请求时,IP地址不会在我的应用程序引擎配置中显示为白色。每次我添加地址时,地址都会更改 长话短说:运行webapp2的python应用程序在本地调用google地图,但在应用程序引擎上部署时无法调用。 是否有我应该使用的特定模块/库?我到处都找过,但大多数解决方案都不推荐使用,或者

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

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

是否有我应该使用的特定模块/库?我到处都找过,但大多数解决方案都不推荐使用,或者要求使用google.appengine.api,它似乎没有我所需要的

编辑

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

\uuuu init\uuuuu.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"
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的文件中。