request.session.modified против SESSION_SAVE_EVERY_REQUEST

#django #django-sessions

#django #django-сеансы

Вопрос:

Я понимаю, как они работают по-разному на практике. Например, если у меня есть:

 request.session.['cart'].remove('item')
  

сеанс не будет сохранен без явного вызова request.session.modified = True

или наличие SESSION_SAVE_EVERY_REQUEST = True в settings.py .

Или я мог бы обойти использование любого из них, используя:

 cart = request.session['cart']
cart.remove('item')
request.session['cart'] = cart
  

Мой вопрос в том, есть ли какие-либо недостатки в использовании SESSION_SAVE_EVERY_REQUEST, будь то производительность или непреднамеренные последствия. Я не вижу никаких причин, по которым я не хотел бы сохранять сеанс, если я изменил в нем значение.

Комментарии:

1. Сеансы хранятся на стороне сервера. Это может быть сделано в кэше (памяти), файловой системе или базе данных. Особенно для последних двух, каждое сохранение при сохранении приведет к накладным расходам на файловую систему / базу данных, поскольку не гарантируется, что что-либо изменилось.

Ответ №1:

(…) если есть какие-либо недостатки в использовании SESSION_SAVE_EVERY_REQUEST , будь то в производительности или непреднамеренных последствиях. Я не вижу никаких причин, по которым я не хотел бы сохранять сеанс, если я изменил в нем значение.

Well SESSION_SAVE_EVERY_REQUEST будет сохранять сеанс каждый раз. Независимо от того, сделали ли вы зависания, поскольку Django не может (идеально) это обнаружить. Таким образом, это означает, что в конце каждого запроса сеанс будет сериализован.

Сеансы хранятся на стороне сервера. Он установит файл cookie в браузере клиента с ключом сеанса, но данные самого сеанса хранятся на стороне сервера. Существует несколько способов хранения сеансов, это можно сделать в кэше e (memory), а также в файле в файловой системе или в базе данных. Особенно последние два приведут к некоторым накладным расходам с точки зрения ввода-вывода файловой системы или запросов к базе данных. Хотя эти операции, скорее всего, не будут узким местом, это дополнительный источник запросов или дискового ввода-вывода и, следовательно, будет иметь некоторые последствия для производительности и, возможно, цены размещения приложения.

Комментарии:

1. Можете ли вы придумать более «питонический способ» для выполнения примера, например, однострочный? Кроме того: request.session[‘корзина’] = request.session . [‘корзина’].удалить(‘товар’)