使用 AJAX 设置时未保存 Django 会话变量

Posted

技术标签:

【中文标题】使用 AJAX 设置时未保存 Django 会话变量【英文标题】:Django session variable not being saved when set using AJAX 【发布时间】:2017-01-02 16:29:13 【问题描述】:

我正在为我的项目使用数据库支持的会话。我正在尝试使用 AngularJS 通过 AJAX 发布请求更新会话变量的值:

app.factory('SomeFactory', ['$http', 'djangoUrl',
  function ($http, djangoUrl) 
    return 
      getSomeDataAndUpdateSessionVar: function () 
        return $http(
          method: 'POST',
          url: djangoUrl.reverse('some_app:list'),
          data: 
            param1: "param1"
          
        )
      ,
    
  
]);

这是我的视图的简化发布方法:

class DocumentListView(JsonRequestResponseMixin, View):
    def post(self, request, *args, **kwargs):
        request_data = json.loads(request.body)
        data_to_be_fetched = request.session.get("data_to_be_fetched", None)
        if not data_to_be_fetched:
            data_to_be_fetched = fetch_data(request_data)
            request.session["data_to_be_fetched"] = data_to_be_fetched
            print request.session.get("data_to_be_fetched")  # This will return the updated value

        return HttpResponse(json.dumps(data_to_be_fetched), content_type="application/json")

似乎会话变量没有被保存,因为如果我再次调用上述方法,data_to_be_fetched 的值仍然是None。奇怪的是,在第二次调用该方法后,会话变量的新值最终会被保存(第二次保存后,data_to_be_fetched 将不再是None)。为什么会这样?它仅在 AJAX 请求期间设置会话变量时发生。

我尝试在更新会话变量后添加以下内容,但行为仍然相同:

request.session.modified = True

我也尝试在设置中添加以下内容,但也无济于事:

SESSION_SAVE_EVERY_REQUEST = True

【问题讨论】:

【参考方案1】:

问题是使用 localhost:8000 而不是 127.0.0.1:8000。因此始终使用 127.0.0.1:8000。 这对我来说是修复。

【讨论】:

以上是关于使用 AJAX 设置时未保存 Django 会话变量的主要内容,如果未能解决你的问题,请参考以下文章

使用 gorilla 会话时未保存 golang 中的会话变量

通过 ngrok 连接时未设置 Cookie

使用 Django admin 时未保存 ManyToMany 字段

Django - ajax 请求中的空会话数据

使用 Android 登录时未设置 Passport.js 会话

无模板 Django + AJAX:Django 的 CSRF 令牌是不是在浏览会话过程中更新?