Django: строка все еще отображается после удаления - из-за кэширования? - PullRequest
2 голосов
/ 23 декабря 2011

Я написал приложение Django, которое использует DataTables . Проблема в том, что когда я удаляю строку из таблицы, она все еще отображается в таблице при работе с nginx / gunicorn. Тем не менее, он работает правильно, когда я работаю на тестовом сервере Django. Поэтому, если я запускаю сервер с этой командной строкой:

python manage.py runserver 192.168.0.1:8000

все отлично работает. То есть я удаляю строку, таблица обновляется, а удаленная строка не отображается.

Это сводка HTTP-вызовов:

// An initial GET command to populate the table
GET /myapp/get_list (returns a list to display)

// I now select a row and delete it which causes this POST to fire
POST /myapp/delete (deletes a row from the list)

// After the POST the code automatically follows up with a GET to refresh the table
GET /myapp/get_list (returns a list to display)

Проблема в том, что когда я использую nginx / gunicorn, второй вызов GET возвращает тот же список, что и первый GET, включая строку, которая, как мне известно, была удалена из внутренней базы данных.

Я не уверен, что это проблема кеширования, потому что это заголовок ответа, который я получаю с первого GET:

Date    Fri, 23 Dec 2011 15:04:16 GMT
Last-Modified   Fri, 23 Dec 2011 15:04:16 GMT
Server  nginx/0.7.65
Vary    Cookie
Content-Type    application/javascript
Cache-Control   max-age=0
Expires Fri, 23 Dec 2011 15:04:16 GMT

Ответы [ 4 ]

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

Вы можете использовать add_never_cache_headers Django или декоратор never_cache, чтобы запретить браузеру кэшировать данный запрос. Документация здесь . Я думаю, что это более чистое решение, чем принудительное отключение кэша в JavaScript.

    from django.utils.cache import add_never_cache_headers

    def your_view(request):
        (...)
        add_never_cache_headers(response)
        return response

    from django.views.decorators.cache import never_cache

    @never_cache
    def your_other_view(request):
            (...)
1 голос
/ 24 декабря 2011

Проблема может быть решена также путем отправки добавленного параметра на сервер, чтобы браузер не кэшировал вызов. С jQuery вы можете просто использовать:

$.ajaxSetup({ cache: false});

В противном случае вы должны создать параметр вручную. Обычно вы создаете отметку времени

var nocache = new Date().getTime();
//send nocache as a parameter so that the browser thinks it's a new call
0 голосов
/ 24 декабря 2011

Я исправил проблему, изменив

GET / myapp / get_list

на

POST / myapp / get_list

После этого я больше не получаю кэшированный ответ.

0 голосов
/ 23 декабря 2011

попробуйте

oTable.fnDeleteRow( anSelected, null, true );

и b.t.w, какую версию таблиц данных вы используете?

...