为什么Django应用程序需要`manage.py`而不是使用`__init__py`?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么Django应用程序需要`manage.py`而不是使用`__init__py`?相关的知识,希望对你有一定的参考价值。
我复制了一些manage.py
线到我的__init__.py
,我所有的views
和models
都可以从任何地方导入而不需要python manage.py shell
:
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
django.setup()
这样我可以在__init__.py
中导入我的子模块(进一步向下):
import glob
modules = glob.glob(os.path.join(os.path.dirname(__file__), '*.py'))
__all__ = [os.path.basename(f)[:-3] for f in modules
if os.path.isfile(f) and not f.endswith('__init__.py')]
from . import *
这样我可以从任何目录执行此操作:
import myproject as mp
mp.models.MyModel.objects.get(field_name='value')
从项目fixtures目录导入数据或进行数据迁移时,这很方便。
这有什么不对吗?如果没有,为什么Django默认情况下这样做,当你python manage.py startproject
?
答案
- 它有什么问题吗?它没有错!不同的开发团队有不同的偏好。虽然django是众所周知的(例如,所有表应该有一个名为
id
的自动增量主键字段),但是你想要加载应用程序的方式取决于你。 - 为什么不默认这样做?我可以想到几个原因。首先,有几个人拥有自己的可重用应用程序,或者甚至还有可以安装的pypi可用django应用程序。如果他们中的每个人都称为
django.setup
django将为每个应用程序设置一次。这也不会考虑在web服务器中运行的多个线程,以及application setup.,当您不一定需要时,可能会导致资源争用。最后,在您需要的情况下,您还会失去对应用程序设置和初始化顺序的一些控制,因为导入顺序现在是按字母顺序而不是通过INSTALLED_APPS
。必须编写管理命令并通过manage.py使用它们似乎是为了与其他应用程序良好匹配而付出的代价。
以上是关于为什么Django应用程序需要`manage.py`而不是使用`__init__py`?的主要内容,如果未能解决你的问题,请参考以下文章
Django学习之三:django-admin 和 项目manage.py程序
什么时候应该使用 django-admin.py 和 manage.py?
使用 manage.py shell 更改 Django 站点显示名称?
如何使用 Django 中的 manage.py CLI 从数据库中删除所有表?