я получил следующую GAE датастора модели (модели/location.py), которые я хочу, чтобы заполнить:Асинхронного место поиска на GAE/webapp2
from google.appengine.ext import db
class Location(db.Model):
name = db.StringProperty(required=True)
country = db.StringProperty(required=False)
address = db.PostalAddressProperty(required=False)
coordinates = db.GeoPtProperty(required=False)
description = db.TextProperty(required=False)
Для этого я создал класс LocationCreateHandler и функция _geocode (handlers/location.py):
from google.appengine.ext import db
from google.appengine.api import urlfetch
from webapp2_extras import json
import urllib
from handlers import BaseHandler
from models.location import Location
import logging
class LocationCreateHandler(BaseHandler):
def post(self):
name = self.request.get("name")
country = self.request.get("country")
address = self.request.get("address")
coordinates = _geocode(self, address)
description = self.request.get("description")
newLocation = Location(name=name, country=country, address=address, coordinates=coordinates, description=description)
newLocation.put()
return self.redirect("/location/create")
def get(self):
self.render_response("location/create.html")
def _geocode(self, address):
try:
logging.info("Geocode address: %s", address)
parameter = {'address': address.encode('utf-8'), 'sensor': 'false'}
payload = urllib.urlencode(parameter)
url = ('https://maps.googleapis.com/maps/api/geocode/json?%s' % payload)
logging.info("Geocode URL: %s", url)
result = urlfetch.fetch(url)
jsondata = json.decode(result.content)
location = jsondata['results'][0]['geometry']['location']
coordinates = '%s,%s' % (location['lat'], location['lng'])
logging.info("Geocode coordinates: %s", coordinates)
return coordinates
except:
return "0.0,0.0"
Как бы сделать это асинхронным? В настоящий момент пользователю придется подождать, пока поиск геокода не завершится. Как только я получу эту работу, я также планирую использовать _geocode() после обновления записи местоположения.
Мне еще нужно выяснить часть _geocode после «result =», кажется, там ошибка, так как я всегда получаю 0.0,0.0.
-Luca.
Да, это именно то, что я имел в виду. Выглядит отлично! –
Извините, что сначала я этого не видел. Stack Overflow не уведомляет вас, если кто-то отправляет другой ответ на вопрос, на который вы ответили. Могли бы вы принять/поддержать мой ответ, если он сработает для вас? –
Привет, Джейми, я принял ваш ответ. Он делает именно то, что должен делать. Большое спасибо! – decurgia