В Django возможно ли получить доступ к текущей сессии пользователя из пользовательского тега? - PullRequest
23 голосов
/ 02 декабря 2008

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

Ответы [ 5 ]

23 голосов
/ 03 декабря 2008

Вы должны иметь возможность добавить обработчик контекста запроса в ваш файл 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',)

Это сделает то же самое, что и текущий ответ, без добавления пользовательского файла.

6 голосов
/ 08 января 2009

Не обидевшись, Себастьяну казалось, что в какой-то момент это был полезный взлом, но как ни странно, 24 декабря в записи блога о доступе к пользовательским данным в Admin, Джеймс Беннетт, менеджер по выпуску Django, сказал: 1001 * об использовании локального хака :

Большой жирный отказ от ответственности: существует множество возможностей для использования этих типов функций. Многие из них не правы и глупы, и вы не должны их пытаться. ... Кроме того, вы иногда будете видеть, как кто-то предлагает, что эти функции могут быть получены с помощью так называемого "локального хака"; это в основном включает в себя вставку request.user в своего рода волшебную глобально доступную переменную, и это очень плохая вещь, которую нужно использовать, если вы не знаете, что делаете. Обычно это очень плохая вещь, даже если вы знаете, что делаете, так как вы, вероятно, просто делаете это, потому что вы ленивы и не хотите, чтобы вы правильно передавали информацию. Поэтому, если вы видите, что кто-то предлагает вам сделать это с помощью «threadlocal», игнорируйте этого человека.

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

4 голосов
/ 02 декабря 2008

Вы можете сделать это с помощью пользовательских контекстных процессоров (см. http://docs.djangoproject.com/en/dev/ref/templates/api/)

В этом случае вы создадите новый файл 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',)

Теперь вы сможете ссылаться на контекст ['сеанс'] в своем пользовательском теге.

Обратите внимание, что это будет работать только для шаблонов, отображаемых с назначенным RequestContext, как в следующем коде:

def test(request):
    return render_to_response('test.html',{}, context_instance=RequestContext(request))
0 голосов
/ 25 июля 2009

Использование render_to decorator из django-раздражает кажется наилучшим вариантом (как видно из другой вопрос по stackoverflow )

0 голосов
/ 02 января 2009

Я нашел это полезным: http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser

Вы можете использовать промежуточное ПО, чтобы получить информацию о пользователе и сохранить ее в локальном потоке, а затем использовать ее с определением вашего тега.

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