应用程序 Applications
django使用注册表为其中的应用存储配置并提供自查,同时,也保存了可用的模型列表,这种注册表就是apps,可以使用django.apps访问
1 | from django.apps import apps |
项目和应用程序 Projects and applications
project就是我们所说的一个web应用,当在django中使用django-admin startproject mysite命令时,就会在项目根目录下创建出一个mysite文件夹,其中包含的settings.py, urls.py, wsgi.py就是一个python包。
Application是提供某些功能的软件包,使用python manage.py startapp appname命令时,就会在项目根目录下创建出一个appname文件夹,其中包含model,view,templates,template tags,static files,urls,middleware等。需要在project的INSTALLED_APPS中完成application的链接。(在project的settings.py中,向INSTALLED_APPS中添加对应app的名字,即可成功将app链入project)
django主要是协助完成各个模块之间的交互,可以理解为是在project调控下的,各个application完成相应的交互。也就是说我们的web是由project组织的各个application的响应。
配置应用程序 Configuring applications
对于app的配置需要使用到AppConfig类,如果设置中有人为的default_app_config变量(init文件中),那么django会使用对应的定义,如果没有,会直接使用AppConfig的基类,1.7版本之后的app尽量避免使用default_app_config
开发者 For application authors
如果想要创建一个名为“Rock ‘n’ roll”的可插拔应用,首先需要创建一个子类
1 | # rock_n_roll/apps.py |
然后默认加载这个类
1 | # rock_n_roll/__init__.py |
当INSTALLED_APPS仅包含rock_n_roll时,RockNRollConfig会被使用,此时不需要更新INSTALLED_APPS的设置就可以使用AppConfig。如果不是这种情况,最好不要使用default_app_config,而是在INSTALLED_APPS中设置
如果在代码中将app的注册表导入到init文件中,那么名称apps会和apps子模块冲突,最好将代码转移到子模块中再导入,可以使用如下方法避免这种冲突
1 | from django.apps import apps as django_apps |
使用者 For application users
当你需要在一个名为anthology的项目中使用“Rock ‘n’ roll”模型,但是又想用“Jazz Manouche”来显示的时候,可以用如下的方法
1 | # anthology/apps.py |
要在子模块中定义项目特定的类app的配置
Application configuration
AppConfig是一个类,存储了app的元数据,某些属性可以在AppConfig子类中定义,其他都是Django预设的可读性质
Configurable attributes 4
- AppConfig.name
- 完整的路径名称,如“django.contrib.admin”
- 明确定义了配置指向的对象,一定要设置
- 在整个django项目中要保持唯一性
- AppConfig.label
- app的简写,如admin
- label默认为name的最后一个部分(有效的标识符),但是当两个app发生label的冲突时,这个属性可以对label进行重设
- 在整个django项目中,label要保持唯一性
- AppConfig.verbose_name
- 人工可读性比较高的另一个名称,如“Administration”
- 这个属性默认为label.title()
- AppConfig.path
- app的文件路径位置,如“usr/lib/python3.4/dist-packages/django/contrib/admin”
- 一般来说,django可以自动检测并且设置这个属性,但是也可以进行重写;当app包是一个有很多路径的命名空间的包时,就会需要。
Read-only attributes 2
- AppConfig.module
- app的根模块
- 如“module ‘django.contrib.admin’ from ‘django/contrib/admin/init.pyc’”
- Appconfig.models_module
- 包含models的模块
- 如module ‘django.contrib,admin.models’ from ‘django/contrib/admin/models.pyc
- 当app中没有model时,可能为None,要注意,数据库相关的信号如pre_migrate 和 post_migrate都只能由存在model的app发出
Methods 3
- AppConfig.get_models()
- AppConfig.get_model(model_name, require_ready=True)
- AppConfig.ready()