django: заполнение дополнительной информации об объекте сразу после сохранения - PullRequest
1 голос
/ 18 февраля 2012

У меня есть веб-сервис в django, который мне нужен для обслуживания запросов так быстро, как я могу. Каждый запрос обновляет объект. Я также сохраняю IP-адрес запроса для заполнения географической информации позже.

Получение географической информации осуществляется внешним поставщиком услуг. Я даю им IP-адрес и получаю географическую информацию.

Поэтому я хочу как можно быстрее обслуживать запросы пользователей и заполнять географическую информацию вскоре после создания / обновления. (через 1-2 сек)

Итак, мне нужен обработчик, который вызывается через 1-2 секунды после ответа на запрос. И он должен иметь обновленный или созданный объект в качестве аргумента.

Полагаю, это не post_save, но я не смог найти правильный путь.

Какой лучший способ достичь этого? Спасибо

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012

Таким образом, задача состоит в том, чтобы вывести работу из цикла запрос-ответ.Вы правы, что сигналы Джанго не имеют к этому никакого отношения.Вы можете попробовать сельдерей для своей задачи, кажется, это самый зрелый и широко используемый способ вывести работу из цикла запрос-ответ для django.

1 голос
/ 18 февраля 2012

Как говорит Михаил в своем ответе, очередь заданий, такая как Celery, безусловно, хороший путь.

Если по какой-то причине вы не хотите сдавать хранениеIP для отдельной задачи, потому что вы не можете быть уверены, что асинхронная задача была выполнена вовремя, вы могли бы по крайней мере ускорить сохранение этой информации, сохранив ее в быстром хранилище значений ключей или NoSQL DB.

Redis отлично подойдет.Добавьте вызов в save() вашей модели, который помещает значение IP в Redis, с ключом, который является уникальным идентификатором для экземпляра модели с именем save(), а затем добавьте метод (или метод с декорированием свойств), который называетсяstored_ip или что-то еще, что знает, как получить IP-адрес от Redis, когда вам нужно отправить его своему гео-партнеру.Когда гео-штука готова, удалите ключ из Redis, чтобы Redis не исчерпал память.

Сохранение IP-адреса таким образом должно быть молниеносным, без особых изменений в вашем текущем коде.

...