Может ли кто-нибудь показать мне пример использования threadlocals в Django?

По сути, я пытаюсь получить доступ к текущему пользователю в models.py в одном из моих приложений. Я уже читал о том, что вы не должны этого делать и как вы должны это делать в views.py и т. д. и т. д. То, что я пытаюсь сделать, использует только серверную часть администратора Django, то есть представления .py вообще не используется.

Вот почему я обращаюсь к threadlocals. Я просмотрел ряд вопросов, касающихся этого, и все, что я нашел, это мертвая ссылка: http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser

Честно говоря, я в тупике и надеялся, что кто-нибудь может предоставить мне некоторую информацию о том, как использовать threadlocals, включая подробности о том, какие настройки мне нужно добавить в мой settings.py и какие файлы мне нужно создать.


person Kenny    schedule 14.03.2013    source источник
comment
Что вы пытаетесь достичь?   -  person Brandon    schedule 14.03.2013
comment
Страница кулинарной книги, на которую вы ссылаетесь, также была удалена, потому что она представляла ужасный способ взлома, который проект Django скорее не продвигал. См. code.djangoproject.com/ticket/13207. Я подозреваю, что что бы вы ни пытались сделать, возможно, threadlocals еще не путь?   -  person Martijn Pieters    schedule 14.03.2013
comment
По сути, я просто пытаюсь сделать простую систему оповещения по электронной почте. Если кто-то создаст, изменит или удалит запись в панели администратора, я получу электронное письмо о том, какой пользователь сделал что с какой моделью. Я уже понял, как определить 3 действия пользователя, упомянутые выше, в файле models.py, а также как отправлять шаблоны электронной почты. Проблема в том, что мне нужно, чтобы информация о текущем пользователе вставлялась в этот шаблон электронной почты. И, как я упоминал ранее, это серверная часть администратора, то есть я вообще не касаюсь views.py.   -  person Kenny    schedule 14.03.2013
comment
Есть ли в модели входа ссылка на пользователя по внешнему ключу?   -  person Brandon    schedule 14.03.2013
comment
Да, модель входа имеет ссылку внешнего ключа на пользователя. Там есть строка: user = models.ForeignKey(User) Однако я считаю, что это поле «пользователь» сохраняет только имя пользователя, создавшего запись. TBH, я все еще новичок в Django, и если есть другой способ выполнить то, что я пытаюсь сделать, я весь в ушах.   -  person Kenny    schedule 14.03.2013


Ответы (1)


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

Подплатформа Сигналы предоставит вам необходимые возможности. Например, pre_delete можно использовать для отправки электронного письма перед удалением объекта. post_save может быть отправлено после создания или обновления записи.

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

[РЕДАКТИРОВАТЬ]

Чтобы получить экземпляр объекта в обработчике сигнала, извлеките его из kwargs, переданных обработчику:

def my_callback(sender, **kwargs):
    instance = kwargs.get('instance')
    # you can now reference instance.user
    # send email code here
person Brandon    schedule 14.03.2013
comment
Ах, как я могу получить доступ к объекту User в обработчике сигнала? На данный момент я связал сигналы с определенными методами, используя такие строки, как: post_save.connect(имя_метода, отправитель = запись, dispatch_uid = 'какая-то уникальная строка') Возможно, есть параметр kwargs, на который я мог бы ссылаться в моем имени_метода? - person Kenny; 14.03.2013
comment
Я добавил пример того, как получить экземпляр объекта. - person Brandon; 14.03.2013
comment
Ах, ты спасатель! Большое спасибо, это сработало! Последний запрос, не могли бы вы указать мне на какую-нибудь документацию о том, какие параметры передаются обработчику сигнала? Я думал о том, чтобы попытаться получить доступ к имени сохраняемой записи, а также к имени и фамилии пользователя. Документация: docs.djangoproject.com/en/1.5/topics/signals даже не упоминается, что объект User передается. Спасибо еще раз! - person Kenny; 15.03.2013
comment
На самом деле, я не уверен, что это где-то задокументировано. Я только что сделал оператор печати на kwargs, чтобы увидеть, что было передано. instance в этом случае будет Entry, если вы прикрепите обработчик сигнала к этой модели. - person Brandon; 15.03.2013
comment
А, ладно, думаю, тогда я немного поиграю с этим. Спасибо еще раз! - person Kenny; 15.03.2013