【问题标题】:django memcached and ajax requestsdjango memcached 和 ajax 请求
【发布时间】:2012-05-18 09:44:52
【问题描述】:

我已经为我的 django 应用程序设置了 memcached(unix 套接字)。然而,当 memcached 开启时,似乎某些 ajax 请求无法正常工作。我在整个网站上都使用 memcached。

例如,在这个 javascript 函数中,.load() 指令第一次工作,但之后它继续从缓存中“获取”相同的页面。

function placeBet(user, bet) {
    var ajax_data = {
        status:false,
        message: ''
    }

    $.ajax({
        url:'/place_bet/' + user + '/?ajax=&bet=' + bet,
        type:"POST",
        dataType:"json",
        data:ajax_data,
        success:function (data){
            var message = "";
            $('#user_open_bets').load('/ob/' + user + '/?ajax=');
            if (data.status == false){
                alert(data.message);
            }
        } // success
    }); // ajax
}

如何强制这些 ajax 请求从数据库而不是从缓存中重新加载?

编辑。

这是我的settings.py MIDDLEWARE 课程

 MIDDLEWARE_CLASSES = (
     'django.middleware.cache.UpdateCacheMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'debug_toolbar.middleware.DebugToolbarMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'main.common.tz_middleware.TimezoneMiddleware',
     'main.common.sslMiddleware.SSLRedirect',
     'django.middleware.cache.FetchFromCacheMiddleware',

【问题讨论】:

  • 我也在使用 memcached。我找不到任何特定于 ajax 请求的问题。它是特定于某些浏览器的吗?
  • 没有。每个浏览器都会发生这种情况。即使在不同的计算机上。我粘贴我的 settings.py MIDDLEWARE 课程

标签: ajax django memcached


【解决方案1】:

似乎答案比我想象的要简单。我在 django 文档中找到了解决方案。

https://docs.djangoproject.com/en/dev/topics/cache/#controlling-cache-using-other-headers

我复制粘贴(让其他人知道)

from django.views.decorators.cache import never_cache

@never_cache
def myview(request):
    # ...

话虽如此,@Alex 的建议似乎很有趣,我想尝试一下。但是现在我的服务器由于迁移原因而关闭。我需要等几个小时。稍后我会在这里报告。

【讨论】:

    【解决方案2】:

    这是默认浏览器行为(缓存 ajax 请求)。为避免向您的请求传递令人上瘾的参数:

    url:'/place_bet/' + user + '/?ajax=&bet=' + bet+'&t='+new Date().getTime()
    

    编辑: 要加载的正确网址是:

    '/ob/' + user + '/?ajax=&t=' + new Date().getTime() 
    

    【讨论】:

    • 不,这是一个 POST。浏览器不缓存 POST。
    • 我相信这是正确的想法,但在错误的路线上。 $('#user_open_bets').load('/ob/' + user + '/?ajax='); 执行可能被缓存的 GET。
    【解决方案3】:

    您是否尝试过添加参数

    cache: false,
    

    您的 ajax 请求?例如:

    $.ajax({
        url:'/place_bet/' + user + '/?ajax=&bet=' + bet,
        type:"POST",
        dataType:"json",
        data:ajax_data,
        cache: false,
        success:function (data){
            var message = "";
            $('#user_open_bets').load('/ob/' + user + '/?ajax=');
            if (data.status == false){
                alert(data.message);
            }
        } // success
    });
    

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 2015-02-13
      • 2013-02-15
      • 2014-04-28
      • 2010-10-11
      • 2020-10-30
      • 2019-02-25
      • 2016-01-02
      • 1970-01-01
      相关资源
      最近更新 更多