Является ли этот пример использования свойства объекта модели уникальным для сеанса входа в систему в django?

#python-3.x #django #security #django-models

#python-3.x #django #Безопасность #django-модели

Вопрос:

Я знаю, что django оптимизирует повторное использование некоторых экземпляров модели. Итак, вопрос в том, действительно ли значение ‘imprints’, показанное ниже, всегда уникально для сеанса входа в систему в django?

Допустим, у меня есть развертывание django, в котором используется эта модель.

 Class Thing(models.Model):
    example_field = models.UUIDField(default=uuid.uuid4, editable=False)
    imprints = None  # placeholder for imprints to be added dynamically


    def add_imprints(self, cc):
        """
        Adds an imprints object associated with this instance for passed cc to this 
        instance.

        """
        self.imprints = cc.imprint_set.get(entity=self)
  

используя ORM, экземпляр этой модели объекта в БД отображается в представлении, скажем, с помощью.

  object = Thing.objects.get(pk=thing_id)
  

затем полю imprints присваивается значение, которое предназначено только как дополнение к экземпляру, чтобы при его передаче другой функции добавленная информация была там — вот так

 object.add_imprints(cc)
  

Чтобы подчеркнуть — значение imprints используется только для передачи информации с экземпляром Thing во время обработки представления и через некоторые связанные функции, нет необходимости в дальнейшем сохранении, и оно должно быть уникальным для сеанса.

Обычно с такой практикой проблем нет, однако здесь может возникнуть проблема безопасности. Мне нужно знать, будет ли django когда-либо использовать тот же экземпляр для другого зарегистрированного пользователя — вместе со значением imprints, с другим сеансом, если они это сделают

 object = Thing.objects.get(pk=thing_id)
  

с тем же thing_id, в то время как другой экземпляр все еще используется.

Ответ №1:

Django создает новый экземпляр модели при получении конкретного объекта запроса.

Вы можете быть уверены, что временные переменные будут только в этом объекте

Вы можете это проверить:

 In [13]: from django.contrib.auth.models import User

In [14]: users = User.objects.all()

In [15]: u = users.first()

In [16]: u
Out[16]: <User: super>

In [17]: u.tmp = 123

In [18]: u.tmp
Out[18]: 123

In [19]: u2 = users.first()

In [20]: u2.tmp
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-20-f4c979d08460> in <module>
----> 1 u2.tmp

AttributeError: 'User' object has no attribute 'tmp'