使用 gunicorn 时如何设置 django 测试服务器?
Posted
技术标签:
【中文标题】使用 gunicorn 时如何设置 django 测试服务器?【英文标题】:How to set up a django test server when using gunicorn? 【发布时间】:2013-01-04 02:16:07 【问题描述】:我正在使用 gunicorn 在 django 中运行一个应用程序。我正在尝试使用 selenium 来测试我的应用,但遇到了问题。
我需要创建一个测试服务器,就像使用 djangos LiveServerTestCase
完成的那样,它可以与 gunicorn 一起使用。
有人知道我该怎么做吗?
注意:也有人可以确认我LiveServerTestCase
是作为线程而不是进程执行的
【问题讨论】:
LiveServerTestCase 作为线程执行 github.com/django/django/blob/master/django/test/… 当你运行LiveServerTestCase
时,Django 会启动它自己的 WSGI 服务器。你真的需要 gunicorn 来做你想做的事吗?
是的,因为我需要 SSL 和 WSGI 服务器 Django 不提供的其他生产功能。
【参考方案1】:
我已经阅读了代码。查看LiveServerTestCase
以获得灵感是有道理的,但试图通过扩展或以某种方式调用LiveServerTestCase
来制造一些东西是在自找麻烦并增加维护成本。
看起来类似于LiveServerTestCase
所做的稳健运行方法是使用自定义setUpClass
和tearDownClass
方法从unittest.TestCase
创建一个测试用例类。 setUpClass
方法:
使用适合测试的设置设置 Django 应用程序的实例:位于不会干扰其他任何内容的位置的数据库,记录到适当位置的日志,如果在正常操作期间发送电子邮件,则使用电子邮件设置这不会让你的系统管理员想要扼杀你,等等。
[实际上,这是一个部署过程。由于我们希望最终部署我们的应用程序,因此上述过程是我们应该开发的过程无论如何。]
将任何必要的装置加载到数据库中。
启动一个 Gunicorn 实例运行 Django 应用程序的这个实例,为此使用常用的操作系统命令。
tearDownClass
:
关闭 Gunicorn 实例,再次使用正常的操作系统命令。
删除为测试而创建的数据库,删除可能已创建的任何日志文件等。
在设置和拆卸之间,我们的测试在分配给 Gunicorn 的端口上联系应用程序,如果需要,它们会加载更多的固定装置,等等。
为什么不尝试使用修改后的LiveServerTestCase
?
LiveServerTestCase
将整个测试设置包含在一个进程中:测试、WSGI 服务器和 Django 应用程序。 Gunicorn 不是为这样的操作而设计的。一方面,它使用主进程和工作进程。
如果 LiveServerTestCase
被修改为以某种方式在外部进程中启动 Django 应用程序,那么这个类的很多好处就会消失。 LiveServerTestCase
依赖它可以只修改其进程空间中的设置或数据库连接,并且这些修改将传递到 Django 应用程序,因为它存在于同一个进程中。如果应用程序处于不同的进程中,这些技巧将不起作用。一旦修改了LiveServerTestCase
以解决此问题,最终结果将接近我上面概述的内容。
补充:有人可以让 Gunicorn 和 Django 在同一个进程中运行吗?
我确信有人可以将它们粘在一起,但请考虑以下问题。这当然意味着要更改 Gunicorn 的 核心 代码,因为 Gunicorn 设计 是为了使用主进程和工作进程。然后,当 Gunicorn 或 Django 的内部结构发生变化导致胶水破裂时,创建胶水的人将负责保持胶水的最新状态。归根结底,这样做比使用此答案开头概述的方法需要更多的工作。
【讨论】:
如果我想在同一个进程上运行 Gunicorn 和 Django 怎么办?这将有助于更轻松地调试测试。 Gunicorn 肉的目标是“从 Python 编写 Gunicorn 脚本”。能够从任意 Python 代码(例如import gunicorn_starter; gunicorn_start.start_gunicorn(someconfig)
)以编程方式启动 Gunicorn 将符合该目标,但仍然不允许您做 您 想要的事情,因为它不会改变 Gunicorn 想要做的事实将自己分成主进程和从进程。
关于 Gunicorn 和 Django 在同一个过程中,我已经添加到我的答案中。【参考方案2】:
在我的脑海中,您可以尝试覆盖 LiveServerTestCase.setUpClass
并结束 gunicorn 而不是 LiveServerThread
【讨论】:
以上是关于使用 gunicorn 时如何设置 django 测试服务器?的主要内容,如果未能解决你的问题,请参考以下文章
如何调试带有whitenoise,gunicorn和heroku的Django静态文件?
如何让 Django 使用 Gunicorn 提供静态文件?
通过 Gunicorn 在 Heroku 上的 Django-twoscoops-project(骨架)。如何设置Procfile?
使用 Gunicorn 和 nginx 部署 Django 项目