Кеширование данных с других сайтов в Джанго - PullRequest
1 голос
/ 01 апреля 2009

Предположим, у меня есть простое представление, которое требует анализа данных с внешнего веб-сайта.

Прямо сейчас это выглядит примерно так:

def index(request):
    source = urllib2.urlopen(EXTERNAL_WEBSITE_URL)
    bs = BeautifulSoup.BeautifulSoup(source.read())
    finalList = [] # do whatever with bs to populate the list
    return render_to_response('someTemplate.html', {'finalList': finalList})

Прежде всего, это приемлемое использование?

Очевидно, что это не очень хорошо с точки зрения производительности. Внешняя страница веб-сайта довольно большая, и я извлекаю только небольшую ее часть. Я думал о двух решениях:

  1. Делайте все это асинхронно. Загрузите оставшуюся часть страницы, заполните данные, как только я их получу. Но я даже не знаю с чего начать. Я только начинаю с Django и до сих пор никогда не делал ничего асинхронного.
  2. Мне все равно, обновляются ли эти данные каждые 2-3 минуты, поэтому кэширование также является хорошим решением (также избавляет меня от дополнительных циклов). Как бы я занялся кэшированием этих данных?

Ответы [ 3 ]

5 голосов
/ 01 апреля 2009

Во-первых, не оптимизируйте преждевременно. Заставь это работать.

Затем добавьте достаточное количество журналов, чтобы увидеть, каковы действительно проблемы с производительностью (если есть).

Вы можете обнаружить, что ПК конечного пользователя - самая медленная часть; получение данных с другого сайта может, на самом деле, быть очень быстрым, если вы не извлекаете библиотеки .JS и .CSS и художественные работы, а затем визуализируете все это в браузере.

Как только вы абсолютно уверены, что извлечение удаленного контента действительно является проблемой. В самом деле. Затем вы должны сделать следующее.

  1. Напишите скрипт "crontab", который время от времени выполняет удаленную выборку.

  2. Дизайн места для кеширования удаленных результатов. База данных или файловая система, выберите один.

  3. Обновите приложение Django, чтобы получать данные из кэша (базы данных или файловой системы) вместо удаленного URL-адреса.

Только после того, как вы получите абсолютное доказательство того, что чтение urllib2 с удаленного сайта является узким местом.

3 голосов
/ 01 апреля 2009

Кэширование с django довольно просто,

from django.core.cache import cache
key = 'some-key'
data = cache.get(key)
if data is None:
    # soupify the page and what not
    cache.set(data, key, 60*60*8)
    return render_to_response ...
return render_to_response

Чтобы ответить на ваши вопросы, вы можете сделать это асинхронно, но тогда вам придется использовать что-то вроде django cron для обновления кеша очень часто. С другой стороны, вы можете написать это как отдельный скрипт на python, заменить кэш, импортированный из django, на memcache, и он будет работать так же. Это уменьшит некоторые проблемы с производительностью, которые могут возникнуть на вашем сайте, и, пока вы знаете ключ кеша, вы можете извлекать данные из кеша.

Как сказал Джаррет, я прочту дополнительную информацию о кешировании django и memcache.

1 голос
/ 01 апреля 2009

Django имеет надежную встроенную поддержку для кэширования представлений: http://docs.djangoproject.com/en/dev/topics/cache/#topics-cache.

Он предлагает решения для кэширования целых представлений (например, в вашем случае) или только определенных частей данных в представлении. Есть даже элементы управления частотой обновления кэша и т. Д.

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