Failed to load resource: the server responded with a status of 504 (Gateway Timeout)
我正在使用Django开发项目-python,javascript。当我从视图中调用一个长时间运行的过程(耗时)约20分钟以上时,该过程成功启动。我在ajax中使用了loader来通知用户该进程正在运行。该过程完成后,加载程序将停止并更改为完成状态。
但是问题出在进程启动14.59分钟之后,每次加载器停止运行并且状态更改为完成。但是后台运行的进程尚未完成。在那之后页面崩溃。完成该过程后,我将结果绑定到网页中的标签下。在该标签中,出现错误504(网关超时)。在Web控制台日志中,无法加载资源:服务器以状态504(网关超时)进行响应,并显示上述错误。如果有人知道,请帮助我解决此问题。
django是在那之后关闭连接吗?如果是这样,则可以在Django设置(settings.py)中提及超时。我尝试在ajax调用中给出超时,但是同样的问题又返回了。我的怀疑是在Django开发服务器上。 django开发服务器中是否存在超时?但是,当我搜索此问题时,发现在Nginx服务器中出现了相同类型的问题。 Django是依靠nginx还是使用它?
如果有任何进一步的说明,我试图提供有关我的问题的所有信息,请告知我。
- 您正在使用什么Web服务器? nginx? 可以在服务器配置中配置超时。
- 我建议使用像这里提到的替代技术。 什么是长轮询,Websocket,服务器发送事件(SSE)和Comet?
- 我没有使用任何Web服务器,而是使用默认的django服务器,即django开发服务器。 我还没有部署。
- 如果您有长期运行的后台任务,则应使用一些异步任务队列将它们带外运行-芹菜就来了。 它不仅可以解决此类问题,而且还可以避免您的Web服务器超负荷运行,并且在需要时(如果需要)运行celery worker时,您可以轻松地扩展并拥有许多不同的服务商。
- 我不想将流程作为后台任务运行,用户必须等到长时间运行的流程完成
服务器始终在特定时间后关闭其连接,可以通过更改其配置来对其进行修改,但这不是一个好的方法。
我建议您尝试通过以下方法减少脚本花费的时间:
- 优化代码。
- 通过缓存经常使用的数据
- 使用后端服务来处理您的数据并将其存储在可以快速访问的临时存储(例如内存缓存或Redis)中。
您还应该处理ajax调用的超时:
1 | $.ajax({ |
调整性能和优化编码技术从而减少时间的参考:
https://docs.djangoproject.com/en/1.10/topics/db/optimization/
https://docs.djangoproject.com/en/1.10/topics/performance/
https://realpython.com/blog/python/caching-in-django-with-redis/