Периодически извлекайте данные и отображайте их с помощью Django.

Я хотел бы реализовать своего рода систему уведомлений «в реальном времени» в моем приложении Django.

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

Я немного застрял на вещи "получать данные каждую минуту". Я слышал о сельдерее (http://docs.celeryproject.org/en/latest/#), но я хотел бы убедиться, что это правильный путь, прежде чем углубляться, потому что это кажется немного сложным в настройке и использовании.

Если есть простой способ демонизировать функцию django или если что-то похожее на то, что я хочу сделать, уже существует, я был бы признателен за любую подсказку!


person Johanna    schedule 13.05.2013    source источник
comment
Одним словом: Аякс. Определите некоторый метод представления для этой конкретной задачи и вызовите его в клиентском коде javascript с помощью Ajax. Это простой способ начать.   -  person Paulo Bu    schedule 13.05.2013
comment
И как вы периодически вызываете этот метод? Я не совсем эксперт Ajax   -  person Johanna    schedule 13.05.2013
comment
И другой вопрос, не будет ли это решение сильно замедлять работу моего приложения?   -  person Johanna    schedule 13.05.2013
comment
На самом деле существует два способа демонизации интернет-приложения. Ajax (самый распространенный) и недавно WebSockects (который еще не полностью поддерживается всеми браузерами). Ajax работает как опрос. Это означает, что вы будете запрашивать ваш веб-сервер каждую минуту. Например, так работает Facebook. Если это просто задача, то ее будет очень легко настроить. Я напишу ответ, чтобы помочь вам.   -  person Paulo Bu    schedule 13.05.2013


Ответы (2)


Если это простая задача, вы можете справиться с Ajax.

Просто объявите один URL-адрес для запроса ajax:

#urls.py

...
url(r'^ajax/my_query$', my_app.views.ajax_processor)
...

затем в вашем my_app/views.py:

#views.py

def ajax_processor(request):

    ... do the processing you want as if it is a normal web request.
    ... like querying the database
    ... you can return a `json` dictionary 
    ... or a normal `render_to_response` template with html

Это должно быть сделано на стороне сервера. На стороне клиента было бы неплохо использовать jQuery с функцией $.ajax и сделать так:

$.ajax({
    url:'/ajax/my_query',  // a normal get request
    success:function(data){  // success is the callback when the server responds
        /* if is json what you decided to return then process the json dict
           if is normal html render it wherver you want
        */
    }
});

Это просто установка, немного кода на стороне сервера и немного кода на стороне клиента.

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

Вот хороший и простой учебник по ajax, предоставленный W3Schools, чтобы помочь вам понять Ajax, и здесь вы можете найти полезную информацию об опросе с помощью ajax/jquery.

Удачи!

person Paulo Bu    schedule 13.05.2013
comment
Спасибо за подробности, я думаю, что попробую это, прежде чем пробовать сельдерей. Я предполагаю, что моя функция должна быть достаточно простой, чтобы ее можно было обрабатывать с помощью ajax. - person Johanna; 13.05.2013
comment
Пожалуйста. Я добавил ссылку на учебник по ajax, чтобы помочь вам немного больше. - person Paulo Bu; 13.05.2013

Вот несколько вариантов для рассмотрения:

  • сельдерей. Да, это не так просто настроить, но очень легко настроить и использовать со стороны python/django через джанго-сельдерей. Также взгляните на сельдерей периодические задачи.

  • rq (Redis Queue). Простая очередь заданий, которую легко настроить.

  • django-хронограф. Легко создавать и запускать задания cron из команд администратора.

Также см:

person alecxe    schedule 13.05.2013
comment
Спасибо вам за ссылки ! Я проверю их как можно скорее :) - person Johanna; 13.05.2013