【问题标题】:How are Ajax/Fetch calls different on production server vs. runserver for Django app?Django 应用程序的生产服务器与运行服务器上的 Ajax/Fetch 调用有何不同?
【发布时间】:2018-06-16 10:20:52
【问题描述】:

--更新已解决--

问题不是我的代码,而是我使用的 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 请求只是将初始化变量值设为零并继续返回这些值。

我正在控制台记录从 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 生产服务器上一遍又一遍地返回。

在我的本地运行服务器上,我得到类似这样的信息,本地服务器向我显示它正在取得的进展:

{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。任何帮助表示赞赏。

【问题讨论】:

  • 我觉得看看你的view.py会很有帮助
  • 我实际上只是在发布此问题后立即解决了这个问题。嗯。问题不是我的代码,而是我使用的 HTTP 服务器库(gunicorn)。我改用女服务员,这解决了我的问题。我会更新帖子。这个链接很有帮助:blog.etianen.com/blog/2014/01/19/gunicorn-heroku-django

标签: javascript ajax django heroku django-views


【解决方案1】:

问题不是我的代码,而是我使用的 HTTP 服务器库。 Gunicorn 显然没有按照我需要的方式开箱即用,所以下面的这篇文章帮助我将 Waitress 作为替代 HTTP 服务器库。现在我的进度更新了它应该的方式。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多