简体   繁体   English

django 核心管理中的未知命令

[英]Unknown command in django core managment

I use Docker, Python and Django in my TDD project.我在我的 TDD 项目中使用 Docker、Python 和 Django。 When I run dcoker command on console:当我在控制台上运行 dcoker 命令时:

docker-compose run app sh -c "python manage.py test"

The get error with message:获取错误消息:

Starting recipe-app-api_db_1 ... done
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
...EE....
======================================================================
ERROR: test_wait_for_db (core.tests.test_commands.CommandsTestCase)
Test waiting for db
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 103, in call_command
    app_name = get_commands()[command_name]
KeyError: 'wait_for_db'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/unittest/mock.py", line 1348, in patched
    return func(*newargs, **newkeywargs)
  File "/app/core/tests/test_commands.py", line 24, in test_wait_for_db
    call_command('wait_for_db')
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 105, in call_command
    raise CommandError("Unknown command: %r" % command_name)
django.core.management.base.CommandError: Unknown command: 'wait_for_db'

======================================================================
ERROR: test_wait_for_db_ready (core.tests.test_commands.CommandsTestCase)
Test waiting for db when db is available
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 103, in call_command
    app_name = get_commands()[command_name]
KeyError: 'wait_for_db'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/app/core/tests/test_commands.py", line 15, in test_wait_for_db_ready
    call_command('wait_for_db')
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 105, in call_command
    raise CommandError("Unknown command: %r" % command_name)
django.core.management.base.CommandError: Unknown command: 'wait_for_db'

----------------------------------------------------------------------
Ran 9 tests in 5.529s

FAILED (errors=2)
Destroying test database for alias 'default'...

Source code of files文件的源代码

File app/tests/test_commands.py :文件app/tests/test_commands.py

from unittest.mock import patch
from django.core.management import call_command
from django.db.utils import OperationalError
from django.test import TestCase

class CommandsTestCase(TestCase):

    def test_wait_for_db_ready(self):
        """Test waiting for db when db is available"""

        with patch('django.db.utils.ConnectionHandler.__getitem__') as gi:
            gi.return_value = True
            call_command('wait_for_db')
            self.assertEqual(gi.call_count, 1)

    @patch('time.sleep', return_value=None)
    def test_wait_for_db(self, ts):
        """Test waiting for db"""

        with patch('django.db.utils.ConnectionHandler.__getitem__') as gi:
            gi.side_effect = [OperationalError] * 5 + [True]
            call_command('wait_for_db')
            self.assertEqual(gi.call_count, 6)

File app/core/managment/commands/wait_for_db.py :文件app/core/managment/commands/wait_for_db.py

import time
from django.db import connection
from django.db.utils import OperationalError
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    """Django command that waits for database to be available"""

    def handle(self, *args, **options):
        """Handle the command"""
        self.stdout.write('Waiting for database...')
        db_conn = None
        while not db_conn:
            try:
                connection.ensure_connection()
                db_conn = True
            except OperationalError:
                self.stdout.write('Database unavailable, waiting 1 second...')
                time.sleep(1)

        self.stdout.write(self.style.SUCCESS('Database available!'))

Why docker can't found my wait_for_db command file?为什么 docker 找不到我的wait_for_db命令文件?

I think you got this error because the folder name in your app should be "management", not "management" ^_^我认为您收到此错误是因为您的应用程序中的文件夹名称应该是“管理”,而不是“管理”^_^

In case anyone else is looking for another answer to a similar problem, make sure you added the related app to installed_apps.如果其他人正在寻找类似问题的另一个答案,请确保您已将相关应用程序添加到 installed_apps。 I had the same issue and after 30 minutes of renaming the files and trying to copy everything right, I realized that I have not yet added my app to the installed app.我遇到了同样的问题,在重命名文件并尝试正确复制所有内容 30 分钟后,我意识到我还没有将我的应用程序添加到已安装的应用程序中。 Therefore Django did not recognize the new management command.因此 Django 没有识别新的管理命令。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM