Python 使用gunicorn时如何设置django测试服务器?
我正在用gunicorn在django运行一个应用程序。我正在尝试使用selenium测试我的应用程序,但遇到了一个问题 我需要创建一个测试服务器,如djangosPython 使用gunicorn时如何设置django测试服务器?,python,django,selenium,gunicorn,Python,Django,Selenium,Gunicorn,我正在用gunicorn在django运行一个应用程序。我正在尝试使用selenium测试我的应用程序,但遇到了一个问题 我需要创建一个测试服务器,如djangosLiveServerTestCase,它将与gunicorn一起工作 有人知道我该怎么做吗 注意:如果有人能确认LiveServerTestCase是作为线程而不是进程执行的,您可以尝试覆盖LiveServerTestCase.setUpClass,并关闭gunicorn,而不是LiveServerThread,我已经阅读了代码。查看
LiveServerTestCase
,它将与gunicorn一起工作
有人知道我该怎么做吗
注意:如果有人能确认
LiveServerTestCase
是作为线程而不是进程执行的,您可以尝试覆盖LiveServerTestCase.setUpClass
,并关闭gunicorn,而不是LiveServerThread,我已经阅读了代码。查看LiveServerTestCase
以获得灵感是有道理的,但试图通过扩展或调用LiveServerTestCase
来编造一些东西会带来麻烦和增加维护成本
运行类似于LiveServerTestCase
的健壮方法是从unittest.TestCase
创建一个带有自定义setUpClass
和tearDownClass
方法的测试用例类。setUpClass
方法:
使用适合测试的设置设置Django应用程序的实例:位于不会干扰任何其他内容的位置的数据库,记录到适当位置的日志,以及在正常操作期间发送电子邮件时,使用不会使系统管理员想扼杀您的电子邮件设置,等等
[实际上,这是一个部署过程。因为我们希望最终部署我们的应用程序,所以我们无论如何都应该开发上面的过程。]
将所需的任何装置加载到数据库中
启动Gunicorn实例运行Django应用程序的此实例,并为此使用常用的OS命令
拆卸类
:
再次使用普通操作系统命令关闭Gunicorn实例
删除为测试而创建的数据库,删除可能已创建的任何日志文件,等等
在安装和拆卸之间,我们的测试会联系分配给Gunicorn的端口上的应用程序,如果需要,他们会加载更多的夹具,等等
为什么不尝试使用修改后的LiveServerTestCase
LiveServerTestCase
将整个测试设置包含在一个过程中:测试、WSGI服务器和Django应用程序。Gunicorn不是为这样操作而设计的。首先,它使用主进程和辅助进程
如果对LiveServerTestCase
进行修改,以某种方式在外部进程中启动Django应用程序,那么这个类的许多好处都将消失LiveServerTestCase
依赖于这样一个事实,即它可以只修改其进程空间中的设置或数据库连接,并且这些修改将延续到Django应用程序,因为它位于同一进程中。如果应用程序处于不同的过程中,这些技巧将无法工作。一旦修改了LiveServerTestCase
来解决这个问题,最终结果就接近我上面概述的结果
附加:有人能让Gunicorn和Django在同一个进程中运行吗
我确信有人可以把它们粘在一起,但请考虑以下几点。这当然意味着要更改Gunicorn的核心代码,因为Gunicorn设计为使用主进程和工作进程。然后,当Gunicorn或Django的内部结构发生变化,导致胶水破裂时,胶水的创造者将负责使胶水保持最新状态。在一天结束时,这样做需要比使用本答案开头所述的方法更多的工作。LiveServerTestCase作为线程执行。当您运行LiveServerTestCase
时,Django会启动自己的WSGI服务器。你真的需要gunicorn来完成你想要做的事情吗?是的,因为我需要SSL和其他WSGI服务器Django不提供的生产功能。如果我真的想在同一个进程上运行gunicorn和Django呢?Gunicorn meat的目标是“从Python编写Gunicorn脚本”。能够从任意Python代码(例如,import Gunicorn\u starter;Gunicorn\u start.start\u Gunicorn(someconfig)
)以编程方式启动Gunicorn符合这一目标,但仍然不允许您执行所需操作,因为这并没有改变Gunicorn希望将自己分为主进程和从进程的事实。关于Gunicorn和Django在同一进程中的问题,我已经补充了我的答案。