gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:53:33 25 4
gpt4 key购买 nike

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

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

当用户提交登录表单时,服务器执行登录 View ,同时客户端开始使用 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 View 发送一个请求(我省略了我的服务器地址,但如果有帮助的话可以分享它!),直到登录完成(步骤==“完成”),然后它只是清除间隔(这有点多余,因为它无论如何都会重定向到新页面)。

以及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,因此它应该是我的生产服务器。我关注了this tutorial设置服务器,所以我的 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/;
}
}

我可以像这样 gunicorn config.wsgi --bind 127.0.0.1:8000 启动 Gunicorn,也可以像这样启动 Gunicorn: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 一次处理多个请求,即阻止所有内容(登录 View )的请求正在异步处理,因此 AJAX 请求将通过。

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

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

关于ajax - 常规请求期间 Django AJAX 请求未通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41435485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com