如何在启动gunicorn之前设置Django服务器状态

2024-04-16 07:49:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个Django服务器,我将使用gunicorn托管该服务器,并希望在使用我的API端点启动一个实际的HTTP服务器之前设置其(Django)的内部状态(从区块链获取和缓存一些数据,启动执行一些后台更新的线程等)。虽然使用“manage.py runserver”(在实际启动服务器之前,使用我需要的所有操作创建我自己的实现)相当容易,但我仍在绞尽脑汁寻找使用WSGI gunicorn服务器实现这一点的最佳方法,该服务器似乎立即启动,但没有明显的方法来指定任何预运行操作

我现在的做法如下:

import asyncio
from django.core.management.commands.runserver import BaseRunserverCommand
from channels.management.commands.runserver import Command as RunChannels
from QTCore.blockchain.blockchain_interop import BcInterop

class Command(RunChannels):
    def inner_run(self, *args, **kwargs):
        async def setup_bc():
            self.stdout.write('Spinning up blockchain interop modules...', ending='\n')
            await BcInterop.init()
            self.stdout.write('Blockchain interop is ready', ending='\n')

        main_loop = asyncio.new_event_loop()
        asyncio.set_event_loop(main_loop)

        try:
            main_loop.run_until_complete(setup_bc())
            self.stdout.write('Launching Django server...', ending='\n')
            super(Command, self).inner_run(*args, **kwargs)
        finally:
            main_loop.close()

Tags: djangorunfromimportself服务器loopasyncio