Domanda

I've written a Django app that uses DataTables. The problem is when I delete a row from the table it's still displayed in the table when running against nginx/gunicorn. However, it works correctly when I'm running against the Django test server. So if I start a server with this command line:

python manage.py runserver 192.168.0.1:8000

everything works fine. That is, I delete the row, the table refreshes, and the deleted row is not displayed.

This is a summary of the HTTP calls:

// 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)

The problem is when I use nginx/gunicorn the second GET call returns the same list as the first GET including the row that I know has been deleted from the backend database.

I'm not sure it's a caching problem either because this is the response header I get from the first 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
È stato utile?

Soluzione

The problem can be solved also by sending an added parameter to the server so that the browser doesn't cache the call. With jQuery you can simply use:

$.ajaxSetup({ cache: false});

Otherwise you must creat manually the parameter. Usually you create a timestamp

var nocache = new Date().getTime();
//send nocache as a parameter so that the browser thinks it's a new call

Altri suggerimenti

You can use Django's add_never_cache_headers or never_cache decorator to tell the browser not to cache given request. Documentation is here. I thinks it's cleaner solution than forcing the cache off in the 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):
            (...)

try this

oTable.fnDeleteRow( anSelected, null, true );

and b.t.w what version of datatables do you use?

I fixed the problem by changing

GET /myapp/get_list

to

POST /myapp/get_list

After doing this, I no longer get a cached response.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top