Как настроить состояние сервера Django перед запуском gunicorn - PullRequest
1 голос
/ 30 сентября 2019

Я создаю сервер Django , который я собираюсь разместить, используя gunicorn и хочу установить его внутреннее состояние (Django) (извлекать и кэшировать некоторые данные из цепочки блоков), запустите пару потоков, которые будут выполнять некоторые фоновые обновления и т. д.) перед запуском реального HTTP-сервера с моими конечными точками API. Хотя это довольно легко сделать с помощью «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()
...