django框架官方文档笔记之API Reference(1):Applications

应用程序 Applications

django使用注册表为其中的应用存储配置并提供自查,同时,也保存了可用的模型列表,这种注册表就是apps,可以使用django.apps访问

1
2
3
>>> from django.apps import apps
>>> apps.get_app_config('admin').verbose_name
'Administration'

项目和应用程序 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
2
3
4
5
# rock_n_roll/apps.py
from django.apps import AppConfig
class RockNRollConfig(AppConfig):
name = 'rock_n_roll'
verbose_name = "Rock 'n' roll"

然后默认加载这个类

1
2
# rock_n_roll/__init__.py
default_app_config = 'rock_n_roll.apps.RockNRollConfig'

当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
2
3
4
5
6
7
8
9
10
11
# anthology/apps.py
from rock_n_roll.apps import RockRollConfig

class JazzManoucheConfig(RockNDRollConfig):
verbose_name = "Jazz Manouche"

# anthology/settings.py
INSTALLED_APPS = [
'anthology.apps.JazzMunoucheConfig',
# ...
]

要在子模块中定义项目特定的类app的配置

Application configuration

AppConfig是一个类,存储了app的元数据,某些属性可以在AppConfig子类中定义,其他都是Django预设的可读性质

Configurable attributes 4

  1. AppConfig.name
    1. 完整的路径名称,如“django.contrib.admin”
    2. 明确定义了配置指向的对象,一定要设置
    3. 在整个django项目中要保持唯一性
  2. AppConfig.label
    1. app的简写,如admin
    2. label默认为name的最后一个部分(有效的标识符),但是当两个app发生label的冲突时,这个属性可以对label进行重设
    3. 在整个django项目中,label要保持唯一性
  3. AppConfig.verbose_name
    1. 人工可读性比较高的另一个名称,如“Administration”
    2. 这个属性默认为label.title()
  4. AppConfig.path
    1. app的文件路径位置,如“usr/lib/python3.4/dist-packages/django/contrib/admin”
    2. 一般来说,django可以自动检测并且设置这个属性,但是也可以进行重写;当app包是一个有很多路径的命名空间的包时,就会需要。

Read-only attributes 2

  1. AppConfig.module
    1. app的根模块
    2. 如“module ‘django.contrib.admin’ from ‘django/contrib/admin/init.pyc’”
  2. Appconfig.models_module
    1. 包含models的模块
    2. 如module ‘django.contrib,admin.models’ from ‘django/contrib/admin/models.pyc
    3. 当app中没有model时,可能为None,要注意,数据库相关的信号如pre_migrate 和 post_migrate都只能由存在model的app发出

Methods 3

  1. AppConfig.get_models()
  2. AppConfig.get_model(model_name, require_ready=True)
  3. AppConfig.ready()

Namespace packages as apps(Python 3.3+)

Application registry

Initialization process

How applications are loaded

Toubleshooting

0%