不使用管理器时 Django 无法设置
Django cannot setup when not using manager
我遇到了一个奇怪的问题,希望以前有人遇到过。
我有一个位于 my_project/my_app/scripts/custom_script.py
的自定义脚本 -- 我想要的用例是为这个脚本提供一个文件路径并让它处理文件和 load/modify 我数据库中的一些数据。
这是该脚本的一个片段:
import django
def setup_django(env):
if env == 'dev':
settings = "my_project.my_project.dev_settings"
elif env == 'stg':
settings = "my_project.my_project.staging_settings"
elif env == 'prod':
settings = "my_project.my_project.prod_settings"
else:
raise ValueError("Invalid choice for --env argument: {}".format(env))
os.environ.setdefault('DJANGO_SETTINGS_MODULE', settings)
django.setup()
def main():
env = 'dev'
setup_django(env)
# Do stuff with my script
当我 运行 从与我的项目相同的 virtualenv 中执行上述操作时,我收到错误 ModuleNotFoundError: No module named 'my_app'
在设置文件中:
...
INSTALLED_APPS = [
'my_app',
'django.contrib.admin',
'django.contrib.auth',
...
]
...
似乎,当我调用 django.setup()
时,它会解析我的 dev_settings
文件并在 INSTALLED_APPS
列表中找到 my_app
,然后尝试导入它直接(例如 import my_app
)。这永远行不通,因为 my_app
是 my_project
的子模块(应该是 import my_project.my_app
)。这是目录结构的示例:
my_project
├── my_project
│ ├── __init__.py
│ ├── dev_settings.py
│ ├── prod_settings.py
│ ├── staging_settings.py
│ ├── urls.py
│ └── wsgi.py
├── my_app
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── scripts
│ │ ├── __init__.py
│ │ ├── **custom_script.py**
│ │ └── utils.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── __init__.py
└── manage.py
此设置文件似乎在 manage.py
中工作良好,在 runserver
和 shell
中均如此(可以找到 my_app
应用程序)。然而在 custom_script.py
里面,一切似乎都丢失了。
有什么想法吗?
使用 management commands 将自定义脚本添加到您的应用程序,以便正确加载所有 Django 配置。
在您的 my_app
文件夹中,创建以下文件夹结构
management/
__init__.py
commands/
__init__.py
my_command.py
在my_command.py
from django.core.management import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **options):
print('running custom command')
在你的 shell
python manage.py my_command
我遇到了一个奇怪的问题,希望以前有人遇到过。
我有一个位于 my_project/my_app/scripts/custom_script.py
的自定义脚本 -- 我想要的用例是为这个脚本提供一个文件路径并让它处理文件和 load/modify 我数据库中的一些数据。
这是该脚本的一个片段:
import django
def setup_django(env):
if env == 'dev':
settings = "my_project.my_project.dev_settings"
elif env == 'stg':
settings = "my_project.my_project.staging_settings"
elif env == 'prod':
settings = "my_project.my_project.prod_settings"
else:
raise ValueError("Invalid choice for --env argument: {}".format(env))
os.environ.setdefault('DJANGO_SETTINGS_MODULE', settings)
django.setup()
def main():
env = 'dev'
setup_django(env)
# Do stuff with my script
当我 运行 从与我的项目相同的 virtualenv 中执行上述操作时,我收到错误 ModuleNotFoundError: No module named 'my_app'
在设置文件中:
...
INSTALLED_APPS = [
'my_app',
'django.contrib.admin',
'django.contrib.auth',
...
]
...
似乎,当我调用 django.setup()
时,它会解析我的 dev_settings
文件并在 INSTALLED_APPS
列表中找到 my_app
,然后尝试导入它直接(例如 import my_app
)。这永远行不通,因为 my_app
是 my_project
的子模块(应该是 import my_project.my_app
)。这是目录结构的示例:
my_project
├── my_project
│ ├── __init__.py
│ ├── dev_settings.py
│ ├── prod_settings.py
│ ├── staging_settings.py
│ ├── urls.py
│ └── wsgi.py
├── my_app
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── scripts
│ │ ├── __init__.py
│ │ ├── **custom_script.py**
│ │ └── utils.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── __init__.py
└── manage.py
此设置文件似乎在 manage.py
中工作良好,在 runserver
和 shell
中均如此(可以找到 my_app
应用程序)。然而在 custom_script.py
里面,一切似乎都丢失了。
有什么想法吗?
使用 management commands 将自定义脚本添加到您的应用程序,以便正确加载所有 Django 配置。
在您的 my_app
文件夹中,创建以下文件夹结构
management/
__init__.py
commands/
__init__.py
my_command.py
在my_command.py
from django.core.management import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **options):
print('running custom command')
在你的 shell
python manage.py my_command