使用 Django 和 Gunicorn 在父级中运行启动代码

问题描述 投票:0回答:3

我需要在 Django 应用程序启动时运行我的代码,然后 Django 开始侦听传入连接。在第一个 HTTP 请求上运行我的代码还不够好。当我使用 Gunicorn 时,我的代码必须在分叉之前在父进程中运行。

https://stackoverflow.com/a/2781488/97248 似乎在 Django 1.4.2 中不起作用:在收到第一个请求之前,它不会运行中间件的

__init__
方法。将代码添加到
urls.py
.

也是如此

快速谷歌搜索没有发现任何有用的信息。

python django hook startup gunicorn
3个回答
2
投票

这是旧的,但在 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()


1
投票

我自己刚刚遇到这个问题,解决方案基本上是链接命令以保证执行和正确的顺序:

由 systemd、supervisord 或任何其他此类系统启动的脚本:

#!/bin/sh
python manage.py my_custom_command && gunicorn project.wsgi $@

创建您自己的自定义 django 命令,然后就可以开始了。如果您在命令 (

requires_system_checks
requires_migrations_checks
设置为
False
)
中禁用健全性检查,则可以获得一些加速。

为了使事情更加通用,您可以创建一个“启动”信号,将任意函数连接到该信号,然后仅从此自定义命令发出信号。


0
投票

Gunicorn 允许您指定各种 hooks,包括

on_starting
pre_fork
,其中任何一个听起来都像您想要的。

如何使用:假设您有模块

my_app.startup_stuff
,其中包含您要运行的以下代码:

def some_prefork_tasks(server):
  print('I\'m running pre-fork')

在运行gunicorn的目录中创建一个

gunicorn.conf.py
文件,其中包含以下内容:

from my_app import startup_stuff

pre_fork = startup_stuff.some_prefork_tasks

然后当你运行gunicorn时,它应该打印“I'm running pre-fork”。

(如果存在,gunicorn.conf.py 会自动加载,但您可以调用任何配置文件并使用

-c <config>
加载它。有关更多信息,请参阅 配置文件上的文档。)

© www.soinside.com 2019 - 2024. All rights reserved.