В Django возможно ли получить доступ к текущему сеансу пользователя из пользовательского тега?
Я пишу пользовательский тег в Django, который должен выводить значение, хранящееся в пользовательском сеансе, но я не могу найти способ доступа к объекту сеанса из пользовательской функции тега. Есть ли способ сделать это, не назначая объект сеанса вручную переменной контекста?
5 ответов
Вы должны иметь возможность добавить обработчик контекста запроса в ваш файл settings.py:
TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'django.core.context_processors.request',)
Это сделает то же самое, что и текущий ответ, без необходимости добавления пользовательского файла.
Без обид Себастьян, поскольку кажется, что в какой-то момент это был полезный хак, но, как ни странно, 24 декабря в записи в блоге о доступе к данным пользователя в Admin Джеймс Беннетт, менеджер по выпуску Django, сказал об использовании threadlocal. взломать:
Большой толстый отказ от ответственности: есть много и много потенциальных применений для этих типов функций. Многие из них не правы и глупы, и вы не должны их пытаться. ... Кроме того, вы иногда будете видеть, как кто-то предполагает, что эти функции могут быть получены с помощью так называемого "локального хака"; это в основном включает в себя вставку request.user в своего рода волшебную глобально доступную переменную, и это очень плохая вещь, которую нужно использовать, если вы не знаете, что делаете. Обычно это очень плохая вещь, даже если вы знаете, что делаете, поскольку, вероятно, вы просто делаете это, потому что ленивы и не хотите, чтобы вы правильно передавали информацию. Поэтому, если вы видите, что кто-то предлагает вам сделать это с помощью "threadlocal", игнорируйте этого человека.
Не говоря о том, что вы должны игнорировать Себастьяна, но, возможно, стоит заняться другими способами, а не использовать threadlocal, что не считается лучшей практикой.
Вы можете сделать это с помощью пользовательских контекстных процессоров (см. http://docs.djangoproject.com/en/dev/ref/templates/api/?from=olddocs).
В этом случае вы создадите новый файл context_processors.py на том же уровне, что и ваш файл settings.py, содержащий:
def add_session(request):
return {'session': request.session}
Затем в вашем файле settings.py добавьте:
TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'context_processors.add_session',)
Теперь вы сможете ссылаться на context['session'] в вашем пользовательском теге.
Обратите внимание, что это будет работать только для шаблонов, отображаемых с назначенным RequestContext, как в следующем коде:
def test(request):
return render_to_response('test.html',{}, context_instance=RequestContext(request))
Использование render_to decorator из django-раздражает, кажется, лучший вариант (как видно из другого вопроса по stackru)
Я нашел это полезным: http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser
Вы можете использовать промежуточное ПО, чтобы получить информацию о пользователе и сохранить ее в локальном потоке, а затем использовать ее с определением вашего тега.