常规请求期间 Django AJAX 请求未通过

2024-05-12

我有一个带有登录网页的 Django 站点。当提交页面上的登录表单时,它会执行登录视图,该视图会在其中运行一个需要很长时间处理(30秒左右)的函数。因此,为了在登录期间向客户端显示进度,一旦提交表单,登录页面上的 JS 函数就会开始向服务器发出 AJAX POST 请求(向poll_stateview),它返回登录状态。然后它更新登录页面的 html 以显示状态(如加载栏)。

我的问题是当我做常规的python manage.py runserver使用 NGINX 代理服务器,它可以完美地工作。但是当我使用 Gunicorn 而不是python manage.py runserver在登录视图完全处理并返回响应(这是下一个网页)之前,AJAX 请求不会执行。它不会轮询登录状态,而是返回一堆错误poll_state加载下一个网页后查看。

当用户提交登录表单时,服务器执行登录视图,同时客户端开始使用 AJAX 请求轮询服务器。以下是登录网页上发送请求的 JS 代码:

      let willstop = 0
      var poll = function() {
        $.ajax({
          url:'http://<my server's ip>/poll_state/',
          type: 'POST',
          data: {
              csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(),
              id: $('#id').val(),
          },
          success: function(pollResult) {
            step = pollResult.data
            if (step == 'Done')
              willstop = 1
            $('#step').html(step)
          }
        })
      }
      let refreshIntervalId = setInterval(function() {
        poll()
        if(willstop == 1) {
          clearInterval(refreshIntervalId);
        }
      }, 500)

它只是向我的服务器发送一个请求poll_state查看(我省略了我的服务器地址,但如果有帮助的话可以分享它!)每半秒一次,直到登录完成(步骤==“完成”),然后它只是清除间隔(这有点多余,因为它重定向无论如何,到一个新页面)。

And the poll_state view:

def poll_state(request):
    """ A view to report the progress to the user """

    data = 'Fail'
    if request.is_ajax() and request.method == 'POST':
        data = loggingInSteps[request.POST.get('id')]
    else:
        data = 'This is not an ajax request'

    result = {'data': data}
    return JsonResponse(result)

loggingInSteps是服务器上的全局字典,其中包含所有客户端的步骤。每个客户端都有一个唯一的id,它是键,值是客户端在登录过程中所处的步骤。键值对在重定向时被删除。

我运行的服务器是 64 位 Ubuntu DigitalOcean Droplet,因此它应该是我的生产服务器。我跟着本教程 http://adambeagle.com/blog/deploying-django-17-ubuntu/设置服务器,所以我的 NGINX 配置是:

server {
  listen 80;
  server_name cume;

  location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  location /static/ {
    alias /home/mikmaks/dev/CUNYsecond/cume/static/;
  }
}

我这样启动 Gunicorngunicorn config.wsgi --bind 127.0.0.1:8000或者作为这样的守护进程:gunicorn config.wsgi --bind 127.0.0.1:8000 --daemon --log-file ~/dev/logs/cume_gunicorn.log --workers=3任何一个版本都不起作用。

有谁知道 Gunicorn 是否可以在处理来自同一客户端的正常请求时接受来自同一客户端的 AJAX 请求?也许问题不在于 Gunicorn,而在于我的 NGINX 配置。十分感谢你的帮助。如有必要,我很乐意提供任何代码或附加信息:)


使用异步工作线程(在我的例子中,我使用了gevent)成功了!现在,Gunicorn 一次处理多个请求,即阻止所有内容(登录视图)的请求正在异步处理,因此 AJAX 请求将通过。

我现在启动 Gunicorn:gunicorn config.wsgi --bind 127.0.0.1:8000 -k gevent --worker-connections 1001 --workers=3。现在唯一的问题是,当负载分配给 3 个工作人员时,它的更新效果不太好,但对于 1 个工作人员来说,它可以完美地工作。我得再想办法看看是否可以让它与 3 个工人一起工作。

谢谢你,亚历克斯,你的帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常规请求期间 Django AJAX 请求未通过 的相关文章

随机推荐

  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和
  • Vuex store.watch 只接受 Vue routerguard 中的函数

    我正在尝试观察并等待 Vue 路由器防护从 Vuex 获取最终值 但它会抛出异常 vuex store watch 只接受一个函数 这是代码 const isAdmin get store getters user isAdmin unde
  • Google Analytics PHP(发送信息)

    大意 我正在开发一个项目 我需要使用 Google Analytics 服务器端 我不需要检索信息 但我需要发送信息 我最终可以发送 js 脚本客户端 但在这种情况下它不是一个选项 以下大多数链接都非常旧 2012年 检索 不是我需要的 我
  • Apache Flink - “keyBy”中的异常处理

    由于代码错误或缺乏验证 进入 Flink 作业的数据可能会触发异常 我的目标是提供一致的异常处理方式 我们的团队可以在 Flink 作业中使用这种方式 而不会导致生产中出现任何停机 重启策略似乎不适用于此处 因为 简单的重启无法解决问题 我
  • 在哪里放置资源特定逻辑

    您能帮我考虑在 AngularJS 中将资源 服务 特定的业务逻辑放置在哪里吗 我觉得在我的资源上创建一些类似模型的抽象应该很棒 但我不确定如何做 API调用 gt GET customers 1 lt first name John la
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用
  • 如何循环遍历颜色数组以更改按键背景(按下/向下)

    互联网 如果这与其他人没有什么关系 请原谅我 但我会将其留在这里 以防这是一个有效的问题 我正在尝试创建一个文本区域字段 其中用户每次按下键 a z 都会触发背景颜色更改 在数组中列出 我一直在用 JQuery 做这件事 我想我已经很接近了
  • SQL Express 上的 OLAP

    我想知道是否有任何桌面 OLAP 解决方案可以使用 SQL Express 因此不需要 Analysis Services 我的任务是找到一种方法让我们的客户能够制作 临时 报告 但其中绝大多数都是在 Sql Express 上 在以前的工
  • 如何使用 WinJS 以编程方式关闭 Win8 应用程序中的 MessageDialog?

    Here is 类似的问题 https stackoverflow com questions 12698666 how to close message dialog programmatically关于如何以编程方式关闭 Win8 应用
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑
  • Google Map v3 地图加载事件[重复]

    这个问题在这里已经有答案了 是否有任何侦听器来处理完全加载的地图 就我而言 我需要从地图获取边界 所以我这样做了 google maps event addListener this map bounds changed this mapL
  • Bloomberg Api 连接问题 - 连接失败

    我正在尝试 Bloomberg C API 示例 出现以下错误 ritesh Ritesh Desktop blpapi cpp 3 7 5 1 Linux RequestServiceExample 64 RequestServiceEx
  • 如何将数组与 setState 一起使用?

    我目前正在使用以下命令将数组映射到 setState 但没有设置任何内容 也没有记录任何错误 如果我明确地逐行写出它 它就会起作用 关于如何解决这个问题有什么想法或建议吗 使用数组设置状态 不设置状态 const myData messag
  • Net core EF 3.1 LINQ 字符串比较不再起作用

    我有以下课程 public class Employee public string Name get set 以及 EF Core 2 1 中的 LINQ 查询 Employee GetEmployeeByName string name
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • 阻止 div 容器调整大小

    我的 html 页面中有两列 一列向右浮动 另一列向左浮动 我已将两个容器的高度设置为 100 将两个容器的宽度设置为 50 我希望这两个容器适合中间的窗户 当用户水平调整窗口大小时 我不希望内容调整大小 我怎样才能做到这一点 Thanks
  • Android Activity 旋转刷新

    我是一名经验丰富的 NET 开发人员 但这是我的第一个 Android 应用程序 它让我发疯 这是一个运行良好的倒计时器 但是当您旋转屏幕时 它会重新初始化归零并停止倒计时的活动 这就是我尝试过的 我摆脱了 CountDownTimer 对
  • 如何处理剪贴板阻塞和其他异常情况

    在过去的几个小时中 我一直在追踪一个相当具体的错误 该错误是由于另一个应用程序打开了剪贴板而发生的 本质上 由于剪贴板是共享资源 根据 为什么我的共享剪贴板不起作用 http blogs msdn com rds archive 2006
  • Ruby 中的 Set 是否始终保留插入顺序?

    即 Ruby 的 Set 相当于 Java 的 LinkedHashSet 吗 在 Ruby 1 9 中 yes 在 Ruby 1 8 中 可能不会 Set uses a Hash内部 https github com ruby ruby
  • 常规请求期间 Django AJAX 请求未通过

    我有一个带有登录网页的 Django 站点 当提交页面上的登录表单时 它会执行登录视图 该视图会在其中运行一个需要很长时间处理 30秒左右 的函数 因此 为了在登录期间向客户端显示进度 一旦提交表单 登录页面上的 JS 函数就会开始向服务器