Обход SESSION_SAVE_ON_EVERY_REQUEST для вызова AJAX или лучшего решения - PullRequest
1 голос
/ 29 декабря 2011

У меня есть частный сайт, который требует входа для всех страниц. Когда пользователь отправляется на редактирование записи, я не хочу блокировать запись. Я хочу сохранить запись доступной для других. Я разработал систему, использующую вызовы AJAX для django, используя dajax / dajaxice, чтобы получить самого последнего человека и дату и время редактирования для записи. Если последнее изменение не было выполнено текущим пользователем, окно предупреждения уведомляет пользователя о том, что другое лицо внесло изменения, так как они открыли запись, и они должны обновить страницу, чтобы получить самую последнюю версию данных.

Это все хорошо, и отлично работает в нашей ситуации. У меня есть тайм-аут сеанса, который, когда истечет время ожидания, отправит пользователя в приглашение на вход в систему. Если пользователь оставляет страницу открытой и покидает компьютер, мы хотим защитить конфиденциальные данные. Это также работает отлично.

Моя проблема заключается в том, что, когда выполняется вызов AJAX для проверки версии данных, чтобы увидеть, изменились ли они, он также сохраняет сеанс, поэтому сеанс никогда не истечет, независимо от того, как долго они находятся на странице. без присмотра.

Есть ли способ в представлении обойти SESSION_SAVE_ON_EVERY_REQUEST, чтобы только этот запрос не инициировал сохранение. Я знаю, что могу вручную сохранить сеанс в каждом ДРУГОМ представлении, но это кажется неправильным. Я полагаю, что смогу написать промежуточное программное обеспечение, которое проверяет запрошенное представление и сохраняет сеанс только в том случае, если оно не является этим представлением, но я не уверен, что это также лучшее решение.

Есть предложения?

Заранее спасибо.

1 Ответ

1 голос
/ 30 декабря 2011

Я почти уверен, что это сработает. Я добавил CustomeMiddleWare в settings.py MIDDLEWARE_CLASSES. Также отключено сохранение сессии при каждом запросе в settings.py.

class CustomMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        if view_func.__module__ != "exclude.module" and view_func.__name__ != "excludeMethod":
            request.session.save()

Теперь проблема в том, что при использовании Dajaxice модуль и имя отображаются как dajaxice_request. Теперь я не знаю, как получить фактический запрошенный метод. Перепробовал кучу вещей, но не смог. Не хочу взламывать код DajaxiceRequest, но, возможно, придется.

  • РЕШЕНИЕ:

    Переключен на jQuery ajax для этого метода. Создана новая запись urls.py, чтобы за один раз получить версию записи. Это делает view_func в process_view доступным, поэтому я могу сохранить сеанс только в тех представлениях, которые вызваны, кроме этого. Ву Ху! Я все еще использую Dajaxice для всех других методологий AJAX.

...