对于Django应用程序,生产服务器与runserver的Ajax / Fetch调用有何不同?

时间:2018-01-07 00:42:05

标签: javascript ajax django heroku django-views

- 更新已解决 -

问题不在于我的代码,而是我正在使用的HTTP服务器库。 Gunicorn显然没有以我开箱即用的方式工作,所以下面这篇文章帮我指出 Waitress 作为另一种 HTTP服务器库。现在我的进度按照预期的方式更新。

链接:http://blog.etianen.com/blog/2014/01/19/gunicorn-heroku-django/

=============================================

我的开发运行服务器的工作原理

我有一个Django应用程序,使用Ajax请求更新进度html标记(目前我正在使用POST,但我已经在我的开发运行服务器上成功使用了GET)。一切都很好。 Ajax请求在我的view.py中调用一个函数,该函数返回一个JsonResponse,其中包含来自我的业务逻辑的更新数据。当我达到某些值时,我正在使用setInterval和setTimeout来控制调用次数和clearInterval。

生产部署到Heroku

我目前正在尝试部署到Heroku并取得99%的成功。我的模板呈现正确,因此我可以看到我的页面并提交表单进行处理。这里1%的问题是我的Ajax请求没有获得更新的数据,我不知道为什么。这就像我的Ajax请求只是将初始化的变量值设置为零并继续返回这些值。

我是console.logging从Ajax调用返回的JSON:

{games: 0, progress: 0, percentage: 0}
{games: 0, progress: 0, percentage: 0}
{games: 0, progress: 0, percentage: 0}
{games: 0, progress: 0, percentage: 0}

这个JSON只是在Heroku生产服务器上反复返回。

在我的本地runserver上,我得到了类似的东西,本地服务器显示了它正在进行的进展:

{games: 5, progress: 1, percentage: 0}
{games: 5, progress: 2, percentage: 0}
{games: 5, progress: 3, percentage: 20}
{games: 5, progress: 4, percentage: 40}
{games: 5, progress: 5, percentage: 40}

我已经对此做了很多研究,实际上只是从Ajax切换到使用Fetch()(抱歉从ajax到fetch的中间切换,但我不认为问题与使用的方法)。 是否有一些我不知道的设置会对在制作中实时更新页面产生影响?这是我当前的Fetch方法:

$("#myButton").click(function call_fetch() {
        fetch('/progress/', {
            method: 'post',
            headers: {
              'X-CSRFToken': csrftoken
            },
            credentials: "same-origin"
        })
          .then(
            function(response) {
              if (response.status !== 200) {
                console.log('Looks like there was a problem. Status Code: ' +
                  response.status);
                return;
              }

              // Examine the text in the response
              response.json().then(function(data) {
                console.log(data);
                document.getElementById("progressBar").max = data["games"];
                document.getElementById("progressBar").value = data["progress"];
                document.getElementById("progressGames").innerHTML = "Game " + data["progress"];
                document.getElementById("percentage").innerHTML = "Percentage Rate: " + data["percentage"] + "%";
                if (data["progress"] == data["games"] && data["progress"] != "0") {
                    clearInterval(interval_id);
                    document.forms.myForm.myButton.disabled = false;
                }
              });
            }
          )
          .catch(function(err) {
            console.log('Fetch Error :-S', err);
          });
        var interval_id = setInterval(setTimeout(call_fetch,2000), 2000);
    });

如果这会产生影响,我不使用基于类的视图?我只是使用2种不同的视图功能。一个呈现index.html页面,另一个呈现进度更新,返回JsonResponse。我正在使用Python-3.6,Django-1.10.6来部署到正在运行的Heroku。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

问题不在于我的代码,而是我正在使用的HTTP服务器库。 Gunicorn显然没有以我开箱即用的方式工作,所以下面这篇文章帮我指出 Waitress 作为另一种 HTTP服务器库。现在我的进度按照预期的方式更新。

链接:http://blog.etianen.com/blog/2014/01/19/gunicorn-heroku-django/