在Google应用引擎上运行的Python应用。如何拨打Google Maps API?

时间:2015-09-16 21:55:22

标签: python google-maps google-app-engine

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

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

我应该使用特定的模块/库吗?我到处寻找,但大多数解决方案已被弃用或要求使用google.appengine.api,这似乎不像我需要的那样。

编辑

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

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

__初始化__。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)

mapRequests.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。()。()子网,所以我会像这里提到的那样修补它。我会回复你的。 还有其他任何建议吗?

1 个答案:

答案 0 :(得分:1)

更改您的API密钥,以允许Google App引擎服务器的整个子网向Google API发出请求

在这种情况下,

将107.178.0.0/16添加到您的凭据