在 Django 开始侦听传入连接之前,我需要在 Django 应用程序启动时运行我的代码。在第一个 HTTP 请求上运行我的代码还不够好。当我使用 Gunicorn 时,我的代码必须在父进程中运行,然后再分叉。
https://stackoverflow.com/a/2781488/97248在 Django 1.4.2 中似乎不起作用:在__init__
收到第一个请求之前,它不会运行中间件的方法。将代码添加到urls.py
.
快速谷歌搜索没有发现任何有用的东西。
我自己也遇到过这个问题,解决方法是基本上将命令链接起来以保证执行和正确的顺序:
由 systemd、supervisord 或任何其他此类系统启动的脚本:
#!/bin/sh
python manage.py my_custom_command && gunicorn project.wsgi $@
创建您自己的自定义 django 命令,然后就可以开始使用了。如果您在命令中禁用健全性检查(requires_system_checks
并requires_migrations_checks
设置为False
),您可以获得一些加速。
为了使事情更通用,您可以创建一个“启动”信号,您可以将任意函数连接到该信号,然后从这个自定义命令发出信号。
这是旧的,但在 Gunicorn 19.0 及更高版本中,您可以创建自定义脚本来运行您的应用程序并在其中包含您需要的启动代码。这是一个使用 django 应用程序的示例脚本:
#!/usr/bin/env python
"""
Script for running Gunicorn using our WSGI application
"""
import multiprocessing
from gunicorn.app.base import BaseApplication
from myapp.wsgi import application # Must be imported first
class StandaloneApplication(BaseApplication):
"""Our Gunicorn application."""
def __init__(self, app, options=None):
self.options = options or {}
self.application = app
super().__init__()
def load_config(self):
config = {
key: value for key, value in self.options.items()
if key in self.cfg.settings and value is not None
}
for key, value in config.items():
self.cfg.set(key.lower(), value)
def load(self):
return self.application
if __name__ == '__main__':
gunicorn_options = {
'bind': '0.0.0.0:8080',
'workers': (multiprocessing.cpu_count() * 2) + 1,
}
# Your startup code here
StandaloneApplication(application, gunicorn_options).run()