动态生成的KML故障排除

时间:2012-01-18 06:38:59

标签: python google-app-engine google-maps-api-3 django-templates python-2.7

我使用dynamically generated KML因为谷歌服务器的“时间问题”而间歇性地失败。上次我检查它工作,但这似乎是一个巧合。我应该每隔5分钟创建一个访问页面的cron作业,以使数据在内存中保持新鲜吗?服务器端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验证器运行output以确保它是正确的。它是动态生成的,我尝试缓存它。它只是间歇性地失败,没有任何理由。我有Python生成KML并检查代码并且应该正常工作。我不知道程序在哪里出错了?我可以获取我的脚本的输出,将其保存为静态kml文件,这是有效的,并且KML是有效的,因此在动态生成谷歌时,它似乎存在“定时问题”。但是我该如何进一步解决这个问题呢?我可以改变使用JSON的整个策略,但这将是很多重新编码,我认为我接近使其工作。

我能想到的3种策略是

  • 更改为Jinja2模板
  • 更改为JSON而非KML
  • 编写一个每5分钟访问一次文件的cron作业,以将数据保存在memcache中 enter image description here 谢谢你的帮助

1 个答案:

答案 0 :(得分:2)

我怀疑构建你的KML花了太长时间才让谷歌放弃。我测试link几次,每次加载需要几秒钟,有时> 5秒。如果无法快速加载文件,则下载和呈现这些KML文件的服务器将超时/放弃。当有时无法加载文件或缓存(发生良好加载时)到期时,这种行为与间歇性失败一致。

如果无法改进生成KML的进程,则应缓存生成的实际文件数据,以便将来更快地返回。使用Task Queue API / Cron,您可以通过每N分钟运行一次重建任务来使该缓存保持最新。