#python #google-app-engine #kmz
#python #google-app-engine #kmz
Вопрос:
Мой код создает zip-файл из Google App Engine для загрузки в браузере, т.е. 10 КБ < размер < 1000 КБ, и мне интересно, могу ли я использовать memcache здесь или файл слишком большой или уже кэширован. Я уже использую оба memcache и устанавливаю управление кэшем при первом создании фактического файла.
class KMZHandler(webapp.RequestHandler):
def add_file(self, zip_file, url, file_name):
"""Fetch url, and add content as file_name to the zip file."""
result = urlfetch.fetch(url)
if not result.content:
return
zip_file.writestr(file_name, result.content)
def get(self):
"""Attempt to create a zip file."""
# you could set 'count' like this:
# count = int(self.request.get('count', 1000))
zipstream = StringIO.StringIO()
zip_file = zipfile.ZipFile(zipstream, "w")
# repeat this for every URL that should be added to the zipfile
url = 'http://www.koolbusiness.com/list.kml'
self.add_file(zip_file, url, "list.kml")
# we have finished with the zip so package it up and write the directory
zip_file.close()
# set the headers...
self.response.headers["Cache-Control"] = "public,max-age=%s" % 86400
self.response.headers['Content-Type'] ='application/zip'
self.response.headers['Content-Disposition'] = 'attachment;filename="list.kmz"'
# create and return the output stream
zipstream.seek(0)
self.response.out.write(zipstream.read())
zipstream.close()
Вот часть, которая использует memcache и создает фактический файл:
class KMLHandler(webapp.RequestHandler):
def get(self):
self.response.headers["Cache-Control"] = "public,max-age=%s" % 86400
start=datetime.datetime.now()-timedelta(days=20)
count = int(self.request.get('count')) if not self.request.get('count')=='' else 1000
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("url IN", ['www.koolbusiness.com']).filter("published =", True).order("-modified").fetch(count)
memcache.set("ads", a)
else:
a = data
dispatch='templates/kml.html'
template_values = {'a': a , 'request':self.request,}
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)
Спасибо за ответы
Комментарии:
1. Должны ли мы знать, насколько велик ваш файл на самом деле? Как следует давать рекомендации, если вы не предоставляете наиболее очевидную информацию о размере файлов?
2. Я ссылался на zip-файл, размер которого может отличаться. Это файл KMZ для загрузки в браузере, и я подумал, может быть, вы знаете максимальное значение для файлов в этих случаях.
Ответ №1:
Если размер файла меньше 1 мб и он не изменяется при каждом запросе, то кэширование памяти в KMZ, скорее всего, уменьшит использование ресурсов.
Файл KMZ еще не находится в memcache, хотя он мог бы находиться во внешнем кэше. Вы кэшируете результаты запроса при создании KML (описание того, как кэшировать объекты в памяти, см. в блоге Ника), но кэш не учитывает различные значения count
или start
. Если это не важно, вы могли бы также рассмотреть возможность прямого кэширования файла KML (или KMZ); если это важно, вам нужно исправить стратегию кэширования.
Комментарии:
1. Приятно познакомиться с Робертом. Спасибо за информативный ответ.