一些静态文件在运行时的Django请求超时管理.py试验包到单元泰斯先生

2024-04-16 23:39:37 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文

我们运行Cypress测试,这些测试使用使用manage.py test package.test.suite启动的应用程序实例。测试装置和环境都是使用从django.contrib.staticfiles.testing.StaticLiveServerTestCase扩展的类来设置的。一个单元测试/方法被添加到扩展类中,该扩展类调用Cypress作为子进程来运行测试,并对子进程的退出代码进行断言。你知道吗

版本:

  • Python:3.6.8版
  • Django:2.2.3版
  • 马科斯:莫哈韦10.14.6

问题:

直到昨天我通过npm更新了Cypress,这一切都很顺利。现在,当我使用manage.py test some.test.suite启动服务器时,服务器将无法为浏览器请求的所有静态资源提供服务。具体来说,它几乎总是无法提供一些.woff字体和一两个随机的javascript/css文件。其余的文件将被提供,但浏览器从未收到响应的5或6个文件除外。最终我将在终端中得到一个ConnectionResetError: [Errno 54] Connection reset by peer错误(下面是堆栈跟踪)。此外,如果我在浏览器中启用缓存并尝试进行一些刷新,则一切都会正常进行,几乎就好像一次可以提供服务的文件数量受到限制一样,一旦浏览器中缓存了一些文件,请求的文件数量就会降到该限制以下。你知道吗

但是,当我执行python manage.py runserver操作时,无论是否启用缓存,我似乎都没有这个问题。你知道吗

堆栈跟踪:

----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 52655)
Traceback (most recent call last):
  File "/Users/myuser/.pyenv/versions/3.6.8/lib/python3.6/socketserver.py", line 320, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/Users/myuser/.pyenv/versions/3.6.8/lib/python3.6/socketserver.py", line 351, in process_request
    self.finish_request(request, client_address)
  File "/Users/myuser/.pyenv/versions/3.6.8/lib/python3.6/socketserver.py", line 364, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/Users/myuser/.pyenv/versions/3.6.8/lib/python3.6/socketserver.py", line 724, in __init__
    self.handle()
  File "/Users/myuser/Path/To/Project/venv/lib/python3.6/site-packages/django/core/servers/basehttp.py", line 171, in handle
    self.handle_one_request()
  File "/Users/myuser/Path/To/Project/venv/lib/python3.6/site-packages/django/core/servers/basehttp.py", line 179, in handle_one_request
    self.raw_requestline = self.rfile.readline(65537)
  File "/Users/myuser/.pyenv/versions/3.6.8/lib/python3.6/socket.py", line 586, in readinto
    return self._sock.recv_into(b)
ConnectionResetError: [Errno 54] Connection reset by peer
----------------------------------------

附加说明/观察结果

  • 当我无头运行测试时,问题也会出现。

  • 安装Cypress确实遇到了一个问题,需要我重新安装Electron和Cypress,清除npm缓存并删除Cypress缓存文件夹。

  • 同样奇怪的是,问题似乎出在python环境中,而不是Cypress本身,因为通过我的浏览器而不是Cypress访问web服务器会产生相同的行为;因此,Cypress可能只是一条红鲱鱼,在这个过程中某种共享依赖关系被更改/更新了。

  • 如果我试图直接访问一个请求期间没有得到服务的文件,它在Chrome开发者的工具网络选项卡中显示为“挂起”,直接通过第二个选项卡它将成功(但有时会延迟几秒钟)。

  • 在关闭测试服务器并尝试再次运行它之后,我将得到一个[OSError: [Errno 48] Address already in use]错误,最多持续一两分钟。以前,服务器会在关闭时立即放弃地址/端口(或者我是这样假设的,因为我以前从未见过这种情况,并且在过去快速关闭并重新运行测试来测试fixture更改)。

我尝试过的事情:

  • 从零开始重建我的虚拟电视
  • 从时间机器备份中复制我的旧venv文件夹
  • 将Cypress的版本恢复到问题之前的版本
  • 查看使用manage.py testmanage.py runserver的超时和连接限制(没有找到任何东西)。你知道吗
  • 切换调试模式和分析开/关。你知道吗
  • 柏树中铬与铬的转换
  • 使用不同的python版本(3.6.5、3.6.7和3.6.8)构建新环境
  • 将Django从2.2.3切换回2.2.2

任何帮助都将不胜感激!你知道吗

更新

进一步研究,对于没有得到响应的文件的请求似乎永远不会从套接字层发送到WSGIHandler(或者即使它们发送到套接字层,我也假设它们会这样做)。你知道吗

更新2

如果包含--nothreading开关,则manage.py runserver也会有相同的行为。我让一个同事给它做了一个测试,他确实看到了manage.py runserver --nothreading的相同行为,但是manage.py test test.to.run对他来说仍然很好。你知道吗

同样,从css/模板中删除字体引用只会产生一组不同的5个文件没有人招待。你知道吗


Tags: 文件inpytestselfpyenvmanagerequest