【问题标题】:How to set up a django test server when using gunicorn?使用 gunicorn 时如何设置 django 测试服务器?
【发布时间】: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 不提供的其他生产功能。

标签: python django selenium gunicorn


【解决方案1】:

我已经阅读了代码。查看LiveServerTestCase 以获得灵感是有道理的,但试图通过扩展或以某种方式调用LiveServerTestCase 来制造一些东西是在自找麻烦并增加维护成本。

看起来类似于LiveServerTestCase 所做的稳健运行方法是使用自定义setUpClasstearDownClass 方法从unittest.TestCase 创建一个测试用例类。 setUpClass 方法:

  1. 使用适合测试的设置设置 Django 应用程序的实例:位于不会干扰其他任何内容的位置的数据库,记录到适当位置的日志,如果在正常操作期间发送电子邮件,则使用电子邮件设置这不会让你的系统管理员想要扼杀你,等等。

    [实际上,这是一个部署过程。由于我们希望最终部署我们的应用程序,因此上述过程是我们应该开发的过程无论如何。]

  2. 将任何必要的装置加载到数据库中。

  3. 启动一个 Gunicorn 实例运行 Django 应用程序的这个实例,为此使用常用的操作系统命令。

tearDownClass:

  1. 关闭 Gunicorn 实例,再次使用正常的操作系统命令。

  2. 删除为测试而创建的数据库,删除可能已创建的任何日志文件等。

在设置和拆卸之间,我们的测试在分配给 Gunicorn 的端口上联系应用程序,如果需要,它们会加载更多的固定装置,等等。

为什么不尝试使用修改后的LiveServerTestCase

  1. LiveServerTestCase 将整个测试设置包含在一个进程中:测试、WSGI 服务器和 Django 应用程序。 Gunicorn 不是为这样的操作而设计的。一方面,它使用主进程和工作进程。

  2. 如果 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

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 2018-03-27
    • 1970-01-01
    • 2021-02-21
    • 2017-03-13
    • 1970-01-01
    • 2017-01-19
    • 2019-12-26
    • 1970-01-01
    相关资源
    最近更新 更多