Я создаю сервер 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()