0

我使用dynamically generated KML,间歇地看起来是因为Google服务器的“计时问题”。上次我检查它的工作,但这似乎是一个巧合。我应该每5分钟访问一次页面,以使数据在内存中保持新鲜状态?在服务器端的KML生成器:动态生成的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以确保它是正确的。它是动态生成的,我尝试缓存它。它只是间歇性地失败,因为没有上诉的原因。我有生成KML的Python,并检查了代码并应该正常工作。我没有看到程序错在哪里?我可以将脚本的输出保存为一个静态的kml文件,并且它的工作原理和KML是有效的,因此在动态生成Google服务时似乎存在“计时问题”。但是,我怎样才能进一步解决这个问题?我可以将整个策略改为使用JSON,但这将会进行大量的重新编码,并且我认为我已经接近完成它的工作。

的3个战略我能想到的是

  • 更改为Jinja2的模板
  • 更改为JSON而不是KML
  • 写访问该文件每隔5分钟,以保持数据的cron作业MEMCACHE enter image description here 感谢所有帮助
+3

什么样的故障?您在App Engine日志中看到错误吗? – 2012-01-18 16:17:49

+0

我偶尔会在日志中看到超时错误,以及何时发生KML失败,我认为*这是一个deadlineexceedederror,并且会严格检查。 – 2012-01-18 22:50:57

+1

什么失败对于真正了解问题是非常重要的。 – 2012-01-19 00:41:12

回答

2

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

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

+0

谢谢你的答案。 – 2012-01-18 22:51:29