Использовать глобальную переменную в Django вместо переменной сеанса?

#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. Кроме того, если этот объект является общесистемным (не сеансовым), вы можете настроить его в модуле «Настройки».