Приведенный ниже пример терпит неудачу.
Нет, это не так. cache.set()
вызов должен дать вам ошибку, как:
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Почему? Внутри Django использует библиотеку pickle Python для сериализации значения, которое вы пытаетесь сохранить в кеше. Если вы хотите снова вытащить его из кеша с помощью своего вызова cache.get()
, Django должен точно знать, как восстановить кешированное значение. И из-за этого желания не потерять информацию или неправильно/ненадлежащим образом восстановить кешированную стоимость, существует несколько restrictions о том, какие виды объектов можно мариновать. Вы заметите, что только эти типы функций могут быть маринованные:
- функции, определенные на верхнем уровне модуля
- встроенные функции, определенные на верхнем уровне модуля
И это дальнейшее объяснение о том, как функционирует травильных работ:
Обратите внимание, что функции (встроенные и определяемые пользователем) замачиваются с помощью «полной квалификации», а не по значению. Это означает, что только имя функции маринуется вместе с именем модуля, в котором функция определена. Ни код функции, ни какой-либо из ее функциональных атрибутов не маринован. Таким образом, определяющий модуль должен быть импортируемым в среде раскалывания, а модуль должен содержать именованный объект, иначе будет создано исключение.