Устранение неполадок динамически генерируемого KML - PullRequest
0 голосов
/ 18 января 2012

Я использую динамически генерируемый KML , который, по-видимому, периодически прерывается из-за «проблем с синхронизацией» с сервером Google.В прошлый раз я проверял, что это сработало, но это похоже на совпадениеДолжен ли я выполнять работу cron, которая обращается к странице каждые 5 минут, чтобы данные оставались свежими в памяти?Серверный генератор KML:

class KMLHandler(webapp2.RequestHandler):

    def get(self):
        self.response.headers['Cache-Control'] = 'public,max-age=%s' \
            % 86400
        start = datetime.datetime.now() - timedelta(days=60)
        from google.appengine.api import memcache
        memcache_key = 'ads'
        data = memcache.get(memcache_key)
        if data is None:
            a = Ad.all().filter('modified >',
                                start).filter('published =',
                    True).order('-modified').fetch(1000)
            memcache.set('ads', a)
        else:
            a = data
        dispatch = 'templates/kml.html'
        template_values = {'a': a, 'request': self.request,
                           'host': os.environ.get('HTTP_HOST',
                           os.environ['SERVER_NAME'])}
        path = os.path.join(os.path.dirname(__file__), dispatch)
        output = template.render(path, template_values)
        self.response.headers['Content-Type'] = \
            'application/vnd.google-earth.kml+xml'
        self.response.headers['Content-Length'] = len(output)
        self.response.out.write(output)

- Файл шаблона:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
{% for ad in a %}
{% if ad.geopt %}
<Placemark><name></name><description>
<![CDATA[{% if ad.uri2view %}<img src="{{ ad.uri2view }}">{% endif %}<a href="http://www.koolbusiness.com/vi/{{ad.key.id}}"> {{ ad.title }} </a><br/>{{ad.text|truncatewords:20}}]]></description><Point><coordinates>{{ad.geopt.lon|floatformat:2}},{{ad.geopt.lat|floatformat:2}}</coordinates></Point></Placemark>{% endif %}{% endfor %}</Document></kml>

- Я также запустил вывод через валидатор KMLчтобы убедиться, что это правильно.Он генерируется динамически, и я пытаюсь его кешировать.Это просто терпит неудачу с перебоями без причины.У меня есть Python, который генерирует KML, и код проверен и должен работать.Я не вижу, где программа не так?Я могу взять вывод моего скрипта, сохранить его в виде статического файла kml, и это работает, и KML действителен, поэтому, похоже, возникают «проблемы с синхронизацией» при передаче его в Google, когда он генерируется динамически.Но как я могу устранить эту проблему дальше?Вместо этого я мог бы изменить всю стратегию на использование JSON, но это будет много перекодировать, и я думаю, что я близок к тому, чтобы заставить это работать.

Можно выделить 3 стратегии:

  • Изменить на шаблоны Jinja2
  • Изменить на JSON вместо KML
  • Написать задание cron, котороеобращается к файлу каждые 5 минут, чтобы сохранить данные в memcache enter image description here Спасибо за любую помощь

1 Ответ

2 голосов
/ 19 января 2012

Я подозреваю, что создание вашего KML занимает слишком много времени, поэтому Google сдается.Я тестировал ссылку несколько раз, и каждый раз загрузка заняла несколько секунд, иногда> 5 секунд.Серверы, которые загружают и визуализируют эти файлы KML, прекратят работу или прекратят работу, если файл не может быть загружен быстро.Такое поведение согласуется с периодическими сбоями, когда файл иногда не может быть загружен или когда кэш (если произошла хорошая загрузка) заканчивается.

Если процесс, генерирующий KML, не может быть улучшенВы должны кэшировать фактические данные файла, которые вы генерируете, чтобы вы могли вернуть их быстрее в будущем.Используя API очереди задач / Cron, вы можете поддерживать этот кэш в актуальном состоянии, выполняя задачу восстановления каждые N минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...