Чистим сессии в django сайте

In human-computer interaction, session management is the process of keeping track of a user’s activity across sessions of interaction with the computer system … Session management is particularly useful in a web browser where a user can save all open pages and settings and restore them at a later date. To help recover from a system or application crash, pages and settings can also be restored on next run. From: Wikepedia

За работу с сессиями в Django отвечает приложение django.contrib.sessions. По умолчанию оно хранит сессии в базе данных. Django не производит автоматическую чистку этой таблицы. Это значит, что если к вам на сайт зашёл Вася, то для него создалась сессия, Вася посмотрел и закрыл вашу страничку. Если вы ничего не делали специально с базой данных, то через год информация о сессии Васи по прежнему будет храниться в базе данных. Для Коли и других пользователей, браузеры которых поддерживают cookies, ситуация аналогична :-)

Будем чистить! Django предоставляет команду manage.py cleanup — она удаляет те сессии, время жизни которых слишком большое. Нужно всего лишь вызывать по крону эту команду. Если у вас много сайтов на вашем сервере, то есть смысл написать shell скрипт. У меня каждый сайт лежит в каталоге /web/site_name/, поэтому я сделал себе такой скрипт:

#!/bin/sh
WEB_ROOT="/web"

for dir in $(find $WEB_ROOT/* -maxdepth 0 -type d); do
    cd $dir
    if [ -f $dir/manage.py ]; then
        echo "Cleaning up the $dir"
        ./manage.py cleanup
    fi  
done

Если вы никогда не чистили таблицу сессий, то команда может работать достаточно долго в первый раз. Если вам нужна скорость, просто выполните SQL DELETE запрос с условием на возраст сессии или обыкновенный TRUNCATE.

Add post to:   Delicious Reddit Slashdot Digg Technorati Google
Make comment

Comments

Может тогда просто использовать файловый бэкенд для кэша, в /tmp ? Будет сам очищаться при рестарте :)

У меня VPS не разу не рестартился. На данный момент аптайм 202 дня и считаю это нормально для linux сервера.

Вокаля 26.07.2009 11:03

Спасибочки!

Сергей 27.07.2009 8:26

А можно как-то не использовать сессии на фронте, если например у меня нет ничего завязанного на сессии, но есть админка?

Не знаю. Надо документацию читать и в код смотреть. В любом случае можно скопировать код стандартной middleware для сессиий и изменить её так, чтобы она обрабатывала только /admin/* адреса.

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image