#python #django #variables #session #global
Вопрос:
У меня есть проект Django, в котором используется довольно сложный объект, который я хотел бы передать в представлениях. Теперь, как правило, для этого используются переменные сеанса:
request.session['variable'] = complex_object
Я осознаю, что это нормальный способ сделать это. Увы, мой очень сложный объект не сериализуется в формате JSON, поэтому я не могу сохранить его в качестве переменной сеанса. Одним из способов решения этой проблемы было бы написать сериализатор для объекта. Но поскольку объект действительно ужасно сложный и вложенный, это даже не утомительно: это невозможно.
Поэтому я искал более простой обходной путь. Я начал работать с глобальными переменными. Это плохая практика, я знаю, но мне нужно решение. Глобальные переменные очень хорошо работают в процессе разработки. Но как только я разворачиваю проект, они начинают становиться очень ненадежными. Иногда они работают, иногда нет. Так что этого тоже не может быть.
Чтобы не сделать этот вопрос слишком сложным для текста, в принципе, какой-нибудь псевдокод покажет вам мои глобальные переменные:
global p
def a(request):
global p
p = 5
def b(request):
global p
print(p)
Как я уже сказал, это хорошо работает в разработке. В производстве не так много.
Есть какие-нибудь идеи? Я бы даже сейчас был готов к грязному взлому.
Редактировать: Маринование объекта не сработает, так как это SwigPyObject, и они не работают с маринованием.
Комментарии:
1. Две непосредственные проблемы, которые я вижу с глобальными переменными, заключаются в следующем: i) запросы от разных пользователей будут изменять одно и то же значение и ii) значение не выдержит перезапуска. Вы можете использовать значение в сеансе пользователя для поиска объекта в словаре, но тогда вам нужно убедиться, что пользователь не может изменить это значение и извлечь чужой объект, и вам все равно нужно выяснить, как сохранить данные.
2. Да, но словарь тоже должен быть в какой-то форме глобальным, верно? Потому что в противном случае я не смогу получить к нему доступ в разных представлениях моего проекта Django
3. Глобальные переменные, конечно, не будут работать с веб-сервером. Если вы действительно не можете хранить данные в базе данных или в сеансе, все, о чем я могу думать, — это использовать модуль pickle и сохранить маринованный объект в файл. Чтобы отслеживать, какой файл для какого пользователя, сохраните его в базе данных с помощью поля файла или сохраните имя файла в переменной сеанса.
4. Возможно
PickleSerializer
, это поможет.5. Кроме того, если этот объект является общесистемным (не сеансовым), вы можете настроить его в модуле «Настройки».