Динамические установленные приложения Django
Я пытаюсь разработать приложение, которое в основном представляет архитектуру плагинов. Каждый плагин представляет собой приложение, которое может быть разработано отдельно и собрано в файл tar.gz
. Затем этот файл загружается на сервер и устанавливается с помощью pip ( я использую этот учебник). Я хотел бы узнать, есть ли способ, чтобы django мог загрузить приложение после его установки.
Вот методы, которые я использовал в своем views.py
def upload(request):
if request.method == 'POST':
app_file = request.FILES['app'] #gets the builded zip
name = request.POST['name'] #gets the name of the app
path = _save_file(app_file) #save the file and return the path
_install_file(path) #install the tar via pip
_add_app(name) #try to load in installed apps
return render(request, 'upload.html')
return render(request, 'upload.html')
def _save_file(file):
path = f'/usr/src/mysite/plugins/{file.name}'
with open(path, 'wb+') as destination:
for chunk in file.chunks():
destination.write(chunk)
return path
def _install_file(path):
code = subprocess.check_call([sys.executable, '-m', "pip", "install", path])
print(code)
def _add_app(name):
installed = settings.INSTALLED_APPS + [name]
# apps.unset_installed_apps()
apps.set_installed_apps(installed)
management.call_command('migrate', name, interactive=False)
Когда я выполняю код и загружаю файл tar.gz
, он выводит:
...
web-mysite | File "/usr/local/lib/python3.9/site-packages/django/apps/registry.py", line 136, in check_apps_ready
web-mysite | raise AppRegistryNotReady("Apps aren't loaded yet.")
web-mysite | django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
Я использую сервер dev, используя опцию noreload
. Заранее спасибо.