Как отправить сообщение сеанса анонимному пользователю на сайте Django?
-
22-08-2019 - |
Вопрос
Я часто показываю сообщения о действиях пользователя вошедшим в систему пользователям в представлениях моего приложения Django, используя:
request.user.message_set.create("message to user")
Как я могу сделать то же самое для анонимных (не вошедших в систему) пользователей?Для анонимных пользователей нет request.user, но в документации Django говорится, что с помощью промежуточного программного обеспечения «сессии» вы можете делать то же самое, что и приведенный выше код.В документации Django, которая ссылается на промежуточное программное обеспечение сеанса, утверждается, что это возможно, но я не смог найти, как это сделать, в документации сеанса.
Решение
Видеть http://code.google.com/p/django-session-messages/ до тех пор, пока патч, который включает сообщения на основе сеанса, не попадет в дерево Django (как я недавно видел, он помечен для версии 1.2, поэтому нет надежды на быстрое добавление...).
Еще один проект с похожей функциональностью — Django Flash (http://djangoflash.destaquenet.com/).
Другие советы
Вот что я делаю, используя контекстные процессоры:
project/application/context.py
(проверьте наличие сообщений и добавьте их в контекст):
def messages(request):
messages = {}
if 'message' in request.session:
message_type = request.session.get('message_type', 'error')
messages = {'message': request.session['message'],
'message_type': message_type}
del request.session['message']
if 'message_type' in request.session:
del request.session['message_type']
return messages
project/settings.py
(добавьте контекст в TEMPLATE_CONTEXT_PROCESSORS
):
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.request",
"django.core.context_processors.debug",
"django.core.context_processors.media",
"django.core.context_processors.auth",
"project.application.context.messages",
)
С учетом вышеизложенного функция messages
будет вызываться при каждом запросе, и все, что он возвращает, будет добавлено в контекст шаблона.При этом, если я хочу отправить пользователю сообщение, я могу сделать это:
def my_view(request):
if someCondition:
request.session['message'] = 'Some Error Message'
Наконец, в шаблоне вы можете просто проверить, есть ли ошибки для отображения:
{% if message %}
<div id="system_message" class="{{ message_type }}">
{{ message }}
</div>
{% endif %}
Тип сообщения просто используется для стилизации в зависимости от того, что это такое («ошибка», «уведомление», «успех») и способа настройки: вы можете добавлять только одно сообщение для пользователя за раз, но это все. Мне действительно когда-нибудь понадобится, так что это работает для меня.Его можно легко изменить, чтобы разрешить несколько сообщений и тому подобное.
Сохраняйте данные непосредственно в сеансе, который представляет собой объект, подобный диктовке.Затем в представлении/шаблоне проверьте значение.
Дополнительная информация здесь:
http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views
Вы также можете создать класс промежуточного программного обеспечения для проверки объекта сеанса при каждом запросе и выполнять там сборку/разборку.