{"title":"应用","version":"3.0","locale":"zh-hans","docname":"ref/applications","url":"/zh-hans/3.0/ref/applications/","canonical":"https://djangodocs.dev/zh-hans/3.0/ref/applications/","summary":"Django 包含一个已安装应用配置记录，能够存储配置和内省。它同时还维护一个可用的模型列表。","html":"<span id=\"applications\"></span><h1>应用<a class=\"heading-anchor\" href=\"#module-django.apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django 包含一个已安装应用配置记录，能够存储配置和内省。它同时还维护一个可用的 <a class=\"reference internal\" href=\"/zh-hans/3.0/topics/db/models/\"><span class=\"doc\">模型</span></a> 列表。</p>\n<p>此注册表称为:attr:应用`~django.apps.apps` ，并且它可用于:mod:django.apps::。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.apps</span> <span class=\"kn\">import</span> apps\n<span class=\"gp\">&gt;&gt;&gt; </span>apps<span class=\"o\">.</span>get_app_config<span class=\"p\">(</span><span class=\"s1\">&#39;admin&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span>verbose_name\n<span class=\"go\">&#39;Administration&#39;</span>\n</code></pre></div>\n<section id=\"projects-and-applications\">\n<h2>项目和应用<a class=\"heading-anchor\" href=\"#projects-and-applications\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>术语 <strong>project（项目）</strong> 指的是一个 Django web 应用，该项目的Python包主要包含配置模块，但通常也包含其他内容。例如，当你在命令行执行 <code class=\"docutils literal notranslate\">django-admin startproject mysite</code> 命令时，你会得到一个名为 <code class=\"docutils literal notranslate\">mysite</code>  的项目目录，其中包含一个同样名为 <code class=\"docutils literal notranslate\">mysite</code> 的Python包，Python包内包括 <code class=\"docutils literal notranslate\">settings.py</code>、 <code class=\"docutils literal notranslate\">urls.py</code>、 <code class=\"docutils literal notranslate\">asgi.py</code> 和 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>wsgi.py``等文件。项目的Python包通常也会扩展从而包含一些其他内容，比如fixture、CSS，以及与特定应用绑定的模板等。</p>\n<p>一个 <strong>项目的根目录</strong> (包含 <code class=\"docutils literal notranslate\">manage.py</code> 文件的目录) 通常是所有项目应用程序的容器，应用不能独立安装。</p>\n<p>术语 <strong>application</strong> 指的是提供了一些功能的 Python 包。应用 <a class=\"reference internal\" href=\"/zh-hans/3.0/intro/reusable-apps/\"><span class=\"doc\">可在多个项目中重用</span></a>。</p>\n<p>应用程序包括模型，视图，模板，模板标签，静态文件，URL，中间件等的一些组合。它们通常使用 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 选项加入到项目中，也可以使用其他机制，如 URLconf， <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</code></a> 配置或模板继承。</p>\n<p>了解Django应用程序是一组与框架的各个部分进行交互的代码，这一点很重要。没有诸如“应用程序”对象之类的东西。但是，在某些Django需要与已安装的应用程序进行交互的地方，主要用于配置和内省。这就是为什么应用程序注册表在每个安装的应用程序的:class:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.apps.AppConfig`实例中维护元数据的原因。</p>\n<p>一个项目包可以自由的作为一个应用程序并包含一些模型等（前提是，需要把它加入 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>）。</p>\n</section>\n<section id=\"configuring-applications\">\n<span id=\"configuring-applications-ref\"></span><h2>配置应用程序<a class=\"heading-anchor\" href=\"#configuring-applications\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>配置一个应用程序，需要继承 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a>，将子类的点式路径加入 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 中。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 包含当前路径到一个应用程序模块的路径时，Django 会检查该模块下的 <code class=\"docutils literal notranslate\">default_app_config</code> 变量。</p>\n<p>如果已经定义，它是当前路径到到达该应用程序子类 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> 的路径。</p>\n<p>如果没有 <code class=\"docutils literal notranslate\">default_app_config</code>，Django 会使用基类 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a>。</p>\n<p><code class=\"docutils literal notranslate\">default_app_config</code> 允许 Django 1.7 之前的应用程序（例如 <code class=\"docutils literal notranslate\">django.contrib.admin</code>）在不要求用户更新 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 的情况下就可以加入 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> 特性。</p>\n<p>新的应用程序应该避免使用 <code class=\"docutils literal notranslate\">default_app_config</code>。相反，它们应该在 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 中显式地配置对应 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> 子类的完整点式路径。</p>\n<section id=\"for-application-authors\">\n<h3>对于应用作者<a class=\"heading-anchor\" href=\"#for-application-authors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果您正在创建一个名为 “Rock”n“roll” 的可插拔应用程序，那么这边将告诉您将如何为管理后台提供一个合适的名称：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># rock_n_roll/apps.py</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">django.apps</span> <span class=\"kn\">import</span> AppConfig\n\n<span class=\"k\">class</span> <span class=\"nc\">RockNRollConfig</span><span class=\"p\">(</span>AppConfig<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> <span class=\"s1\">&#39;rock_n_roll&#39;</span>\n    verbose_name <span class=\"o\">=</span> <span class=\"s2\">&quot;Rock ’n’ roll&quot;</span>\n</code></pre></div>\n<p>你可以通过如下方式使应用程序默认加载这个 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># rock_n_roll/__init__.py</span>\n\ndefault_app_config <span class=\"o\">=</span> <span class=\"s1\">&#39;rock_n_roll.apps.RockNRollConfig&#39;</span>\n</code></pre></div>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 包含 <code class=\"docutils literal notranslate\">'rock_n_roll'</code> 时会使用 <code class=\"docutils literal notranslate\">RockNRollConfig</code>。这允许你充分利用 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> 的功能特性，无需使你的用户去更新他们的 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 配置。除此之外，最好避免使用 <code class=\"docutils literal notranslate\">default_app_config</code>，而是使用后续介绍的在 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 中指定应用配置类。</p>\n<p>当然，也可以让你的用户把 'rock_n_roll.apps.RockNRollConfig' 放到他们的 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 配置文件中。你甚至可以提供具有不同行为的 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> 的子类，让用户选择他们所需要的，将其加入到 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 配置中。</p>\n<p>惯例是将配置类放在应用程序名为 <code class=\"docutils literal notranslate\">apps</code> 的子模块中。但是，这不是 Django 强制规定的。</p>\n<p>你必须包含 attr:~django.apps.AppConfig.name 属性，Django 用它决定这个配置会应用于哪个应用。你定义任何在 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> API 参考中记录的属性。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>若你在应用的 <code class=\"docutils literal notranslate\">__init__.py</code> 中导入了应用注册信息，名称 <code class=\"docutils literal notranslate\">apps</code> 会与子模块 <code class=\"docutils literal notranslate\">apps</code> 冲突。最好的办法是将此段带入移入子模块，再导入它。折中方案是导入后取个别名:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.apps</span> <span class=\"kn\">import</span> apps <span class=\"k\">as</span> django_apps\n</code></pre></div>\n</aside>\n</section>\n<section id=\"for-application-users\">\n<h3>对于应用使用者<a class=\"heading-anchor\" href=\"#for-application-users\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>项目中直接使用 &quot;Rock ’n’ roll&quot;，其名字会是 <code class=\"docutils literal notranslate\">anthology</code>，但是你可能期望显示 &quot;Jazz Manouche&quot;，这需要你提供自定义配置:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># anthology/apps.py</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">rock_n_roll.apps</span> <span class=\"kn\">import</span> RockNRollConfig\n\n<span class=\"k\">class</span> <span class=\"nc\">JazzManoucheConfig</span><span class=\"p\">(</span>RockNRollConfig<span class=\"p\">):</span>\n    verbose_name <span class=\"o\">=</span> <span class=\"s2\">&quot;Jazz Manouche&quot;</span>\n\n<span class=\"c1\"># anthology/settings.py</span>\n\nINSTALLED_APPS <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s1\">&#39;anthology.apps.JazzManoucheConfig&#39;</span><span class=\"p\">,</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>同样，在名为 <code class=\"docutils literal notranslate\">app</code> 的子模块中定义项目配置类是一种约定俗成的惯例，但不强求。</p>\n</section>\n</section>\n<section id=\"application-configuration\">\n<h2>应用配置<a class=\"heading-anchor\" href=\"#application-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">AppConfig</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>应用程序配置对象存储了应用的元数据。某些属性可以在 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> 的子类中配置。而其它 Django 设置好的配置是只读的。</p>\n</dd></dl>\n\n<section id=\"configurable-attributes\">\n<h3>可配置属性<a class=\"heading-anchor\" href=\"#configurable-attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.name\">\n<span class=\"sig-prename descclassname\">AppConfig.</span><span class=\"sig-name descname\">name</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>指向此应用的完整的 Python 格式的路径，如 <code class=\"docutils literal notranslate\">'django.contrib.admin'</code>。</p>\n<p>此属性定义配置适用的应用程序。每个 'django.apps.AppConfig` 子类都必须包含此项。</p>\n<p>它必须在整个 Django 项目中唯一。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.label\">\n<span class=\"sig-prename descclassname\">AppConfig.</span><span class=\"sig-name descname\">label</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.label\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>应用简称，如 <code class=\"docutils literal notranslate\">'admin'</code></p>\n<p>此属性允许在两个应用标签冲突时重命名其中一个的标签名。默认是 <code class=\"docutils literal notranslate\">name</code> 的最后一段。必须是一个有效的 Python 标识符。</p>\n<p>它必须在整个 Django 项目中唯一。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.verbose_name\">\n<span class=\"sig-prename descclassname\">AppConfig.</span><span class=\"sig-name descname\">verbose_name</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.verbose_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>应用容易被人理解的名称，如 &quot;Administration&quot;。</p>\n<p>此属性默认值为 <code class=\"docutils literal notranslate\">label.title()</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.path\">\n<span class=\"sig-prename descclassname\">AppConfig.</span><span class=\"sig-name descname\">path</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.path\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>应用目录的文件系统路径，如 <code class=\"docutils literal notranslate\">'/usr/lib/pythonX.Y/dist-packages/django/contrib/admin'</code>。</p>\n<p>大多数情况下，Django 能自动检测并设置此属性，但你也能在 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> 子类中申明此属性，显式地重写它。很少情况下要这么做；例如，若应用包是一个拥有多个路径的 <a class=\"reference internal\" href=\"#namespace-package\">命名空间</a>。</p>\n</dd></dl>\n\n</section>\n<section id=\"read-only-attributes\">\n<h3>只读属性<a class=\"heading-anchor\" href=\"#read-only-attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.module\">\n<span class=\"sig-prename descclassname\">AppConfig.</span><span class=\"sig-name descname\">module</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.module\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>应用的根模块，如 <code class=\"docutils literal notranslate\">&lt;module 'django.contrib.admin' from 'django/contrib/admin/__init__.py'&gt;</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.models_module\">\n<span class=\"sig-prename descclassname\">AppConfig.</span><span class=\"sig-name descname\">models_module</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.models_module\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>包含模型的模块，如 <code class=\"docutils literal notranslate\">&lt;module 'django.contrib.admin.models' from 'django/contrib/admin/models.py'&gt;</code>。</p>\n<p>应用不包含 <code class=\"docutils literal notranslate\">models</code> 模块时，可能是 <code class=\"docutils literal notranslate\">None</code>。注意，数据库关联的信号，例如 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/signals/#django.db.models.signals.pre_migrate\" title=\"django.db.models.signals.pre_migrate\"><code class=\"xref py py-data docutils literal notranslate\">pre_migrate</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\">post_migrate</code></a> 仅在应用有 <code class=\"docutils literal notranslate\">models</code> 模块时发出。</p>\n</dd></dl>\n\n</section>\n<section id=\"methods\">\n<h3>方法<a class=\"heading-anchor\" href=\"#methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.get_models\">\n<span class=\"sig-prename descclassname\">AppConfig.</span><span class=\"sig-name descname\">get_models</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.get_models\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>为该应用返回一个可迭代的 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">Model</code></a> 类。</p>\n<p>要求完整填写应用注册信息。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.get_model\">\n<span class=\"sig-prename descclassname\">AppConfig.</span><span class=\"sig-name descname\">get_model</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model_name</em>, <em class=\"sig-param\">require_ready<span class=\"o\">=</span><span class=\"default_value\">True</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.get_model\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给出的 <code class=\"docutils literal notranslate\">model_name</code> 的 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">Model</code></a>。 <code class=\"docutils literal notranslate\">model_name</code> 是大小写敏感的。</p>\n<p>如果应用中不存在此模块，则抛出 LookupError 异常。</p>\n<p>除 <code class=\"docutils literal notranslate\">require_ready</code> 参数为 <code class=\"docutils literal notranslate\">False</code> 的情况下，都必须完整设置注册信息。 <code class=\"docutils literal notranslate\">require_ready</code> 行为与 <a class=\"reference internal\" href=\"#django.apps.apps.get_model\" title=\"django.apps.apps.get_model\"><code class=\"xref py py-meth docutils literal notranslate\">apps.get_model()</code></a> 一致。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.AppConfig.ready\">\n<span class=\"sig-prename descclassname\">AppConfig.</span><span class=\"sig-name descname\">ready</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.AppConfig.ready\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>子类可以重写此方法来执行类似注册信号的初始化任务。只要注册表被填满就会调用此方法。</p>\n<p>虽然你不能在定义 <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> 类的模型层导入模型，但可以在 <code class=\"docutils literal notranslate\">ready()</code> 中导入，通过 <code class=\"docutils literal notranslate\">import</code> 语句或 <a class=\"reference internal\" href=\"#django.apps.AppConfig.get_model\" title=\"django.apps.AppConfig.get_model\"><code class=\"xref py py-meth docutils literal notranslate\">get_model()</code></a>。</p>\n<p>若你正在注册 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/signals/#module-django.db.models.signals\" title=\"django.db.models.signals: Signals sent by the model system.\"><code class=\"xref py py-mod docutils literal notranslate\">model signals</code></a>，你可以通过字符串标签追踪发信者，而不是用模型类。</p>\n<p>举例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.apps</span> <span class=\"kn\">import</span> AppConfig\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models.signals</span> <span class=\"kn\">import</span> pre_save\n\n\n<span class=\"k\">class</span> <span class=\"nc\">RockNRollConfig</span><span class=\"p\">(</span>AppConfig<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">ready</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># importing model classes</span>\n        <span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> MyModel  <span class=\"c1\"># or...</span>\n        MyModel <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_model<span class=\"p\">(</span><span class=\"s1\">&#39;MyModel&#39;</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># registering signals with the model&#39;s string label</span>\n        pre_save<span class=\"o\">.</span>connect<span class=\"p\">(</span>receiver<span class=\"p\">,</span> sender<span class=\"o\">=</span><span class=\"s1\">&#39;app_label.MyModel&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>尽管可以向上面介绍的那样访问模型类，但是要避免在 <a class=\"reference internal\" href=\"#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">ready()</code></a> 实现中与数据库交互。这包括了那些会通过 <code class=\"docutils literal notranslate\">django.db.connection</code> 执行查询 (<a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a>， <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/instances/#django.db.models.Model.delete\" title=\"django.db.models.Model.delete\"><code class=\"xref py py-meth docutils literal notranslate\">delete()</code></a>，管理器方法，等等) 和原生查询的模型方法。你的 <a class=\"reference internal\" href=\"#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">ready()</code></a> 方法会在每个管理命令初始化阶段被执行。例如，虽然测试数据库的配置与生成环境配置是分开的， <code class=\"docutils literal notranslate\">manager.py test</code> 仍会对 <strong>生产环境</strong> 数据库执行一些查询操作。</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>在普通的初始化进程中， <code class=\"docutils literal notranslate\">ready</code> 方法仅被 Django 调用一次。但在一些特殊情况下，特别是针对已安装应用的测试中，可以会多次调用 <code class=\"docutils literal notranslate\">ready</code>。这种情况下，在 <code class=\"docutils literal notranslate\">AppConfig</code> 类中编写幂等方法或放入一个标志，避免那些只需运行一次的代码被多次执行。</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"namespace-packages-as-apps\">\n<span id=\"namespace-package\"></span><h3>命名空间包作为应用程序<a class=\"heading-anchor\" href=\"#namespace-packages-as-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>没有__init__.py文件的Python包被称为“命名空间包”，并且可能分布在sys.path上不同位置的多个目录中（见：pep:'420'）</p>\n<p>Django应用程序需要一个单一的基本文件系统路径，Django（取决于配置）将在其中搜索模板、静态资产等。因此，只有在以下情况之一为真时，命名空间包才可能是Django应用程序：</p>\n<ol class=\"arabic simple\">\n<li><p>名称空间包实际上只有一个位置（即不分布在多个目录中）。</p></li>\n<li><p>The <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> class used to configure the application\nhas a <a class=\"reference internal\" href=\"#django.apps.AppConfig.path\" title=\"django.apps.AppConfig.path\"><code class=\"xref py py-attr docutils literal notranslate\">path</code></a> class attribute, which is the\nabsolute directory path Django will use as the single base path for the\napplication.</p></li>\n</ol>\n<p>If neither of these conditions is met, Django will raise\n<a class=\"reference internal\" href=\"/zh-hans/3.0/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\">ImproperlyConfigured</code></a>.</p>\n</section>\n</section>\n<section id=\"application-registry\">\n<h2>注册应用<a class=\"heading-anchor\" href=\"#application-registry\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps\">\n<span class=\"sig-name descname\">apps</span><a class=\"heading-anchor\" href=\"#django.apps.apps\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>应用程序注册表提供以下公共API。以下未列出的方法被视为私有方法，可能会更改，恕不另行通知。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps.ready\">\n<span class=\"sig-prename descclassname\">apps.</span><span class=\"sig-name descname\">ready</span><a class=\"heading-anchor\" href=\"#django.apps.apps.ready\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Boolean attribute that is set to <code class=\"docutils literal notranslate\">True</code> after the registry is fully\npopulated and all <a class=\"reference internal\" href=\"#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">AppConfig.ready()</code></a> methods are called.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps.get_app_configs\">\n<span class=\"sig-prename descclassname\">apps.</span><span class=\"sig-name descname\">get_app_configs</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.apps.get_app_configs\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回一个由django.apps.AppConfig类实例组成的可迭代对象</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps.get_app_config\">\n<span class=\"sig-prename descclassname\">apps.</span><span class=\"sig-name descname\">get_app_config</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">app_label</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.apps.get_app_config\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns an <a class=\"reference internal\" href=\"#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> for the application with the\ngiven <code class=\"docutils literal notranslate\">app_label</code>. Raises <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#LookupError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\">LookupError</code></a> if no such application\nexists.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps.is_installed\">\n<span class=\"sig-prename descclassname\">apps.</span><span class=\"sig-name descname\">is_installed</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">app_name</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.apps.is_installed\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Checks whether an application with the given name exists in the registry.\n<code class=\"docutils literal notranslate\">app_name</code> is the full name of the app, e.g. <code class=\"docutils literal notranslate\">'django.contrib.admin'</code>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.apps.apps.get_model\">\n<span class=\"sig-prename descclassname\">apps.</span><span class=\"sig-name descname\">get_model</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">app_label</em>, <em class=\"sig-param\">model_name</em>, <em class=\"sig-param\">require_ready<span class=\"o\">=</span><span class=\"default_value\">True</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.apps.apps.get_model\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns the <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">Model</code></a> with the given <code class=\"docutils literal notranslate\">app_label</code>\nand <code class=\"docutils literal notranslate\">model_name</code>. As a shortcut, this method also accepts a single\nargument in the form <code class=\"docutils literal notranslate\">app_label.model_name</code>. <code class=\"docutils literal notranslate\">model_name</code> is\ncase-insensitive.</p>\n<p>Raises <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#LookupError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\">LookupError</code></a> if no such application or model exists. Raises\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#ValueError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\">ValueError</code></a> when called with a single argument that doesn't contain\nexactly one dot.</p>\n<p>Requires the app registry to be fully populated unless the\n<code class=\"docutils literal notranslate\">require_ready</code> argument is set to <code class=\"docutils literal notranslate\">False</code>.</p>\n<p>Setting <code class=\"docutils literal notranslate\">require_ready</code> to <code class=\"docutils literal notranslate\">False</code> allows looking up models\n<a class=\"reference internal\" href=\"#app-loading-process\"><span class=\"std std-ref\">while the app registry is being populated</span></a>,\nspecifically during the second phase where it imports models. Then\n<code class=\"docutils literal notranslate\">get_model()</code> has the same effect as importing the model. The main use\ncase is to configure model classes with settings, such as\n<a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a>.</p>\n<p>When <code class=\"docutils literal notranslate\">require_ready</code> is <code class=\"docutils literal notranslate\">False</code>, <code class=\"docutils literal notranslate\">get_model()</code> returns a model class\nthat may not be fully functional (reverse accessors may be missing, for\nexample) until the app registry is fully populated. For this reason, it's\nbest to leave <code class=\"docutils literal notranslate\">require_ready</code> to the default value of <code class=\"docutils literal notranslate\">True</code> whenever\npossible.</p>\n</dd></dl>\n\n</section>\n<section id=\"initialization-process\">\n<span id=\"app-loading-process\"></span><h2>初始化进程<a class=\"heading-anchor\" href=\"#initialization-process\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"how-applications-are-loaded\">\n<h3>应用是如何被加载的<a class=\"heading-anchor\" href=\"#how-applications-are-loaded\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django 启动后， <a class=\"reference internal\" href=\"#django.setup\" title=\"django.setup\"><code class=\"xref py py-func docutils literal notranslate\">django.setup()</code></a> 负责配置应用注册信息。</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.setup\">\n<span class=\"sig-name descname\">setup</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">set_prefix<span class=\"o\">=</span><span class=\"default_value\">True</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.setup\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>配置 Django：</p>\n<ul class=\"simple\">\n<li><p>加载配置。</p></li>\n<li><p>设置日志。</p></li>\n<li><p>若 <code class=\"docutils literal notranslate\">set_prefix</code> 为 True，为 URL 处理器脚本增加前缀 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-FORCE_SCRIPT_NAME\"><code class=\"xref std std-setting docutils literal notranslate\">FORCE_SCRIPT_NAME</code></a>，若未定义此项，则使用 <code class=\"docutils literal notranslate\">/</code>。</p></li>\n<li><p>初始化应用注册</p></li>\n</ul>\n<p>这个函数会被自动调用。</p>\n<ul class=\"simple\">\n<li><p>当通过 Django 的 WSGI 支持运行 HTTP 服务。</p></li>\n<li><p>调用一个管理命令时。</p></li>\n</ul>\n<p>在其他情况下，必须显式调用它，例如在纯 Python 脚本中。</p>\n</dd></dl>\n\n<p>应用注册的初始化过程分三个阶段完成。在每个阶段，Django 根据应用在 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 中的顺序依次处理。</p>\n<ol class=\"arabic\">\n<li><p>首先，Django 导入 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 中各项条目。</p>\n<p>If it's an application configuration class, Django imports the root package\nof the application, defined by its <a class=\"reference internal\" href=\"#django.apps.AppConfig.name\" title=\"django.apps.AppConfig.name\"><code class=\"xref py py-attr docutils literal notranslate\">name</code></a> attribute. If\nit's a Python package, Django creates a default application configuration.</p>\n<p><em>在这情况下，你的代码不应该导入任何模型！</em></p>\n<p>换句话说，应用程序的根包和定义应用程序配置类的模块不能导入任何模型，即使是间接导入。</p>\n<p>严格来说，一旦应用配置完成加载后，Django 是允许导入模型。然而为了避免不必要的 <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>, 顺序约束。强烈建议在这个阶段不要导入任何模型。</p>\n<p>一旦这个阶段完成，可以使用 API 对应用程序配置（如：meth：〜apps.get_app_config() ）进行操作。</p>\n</li>\n<li><p>然后 Django 尝试导入每个存在模型的应用程序中，继承了``models``的所有子模型。</p>\n<p>您必须在应用程序的“models.py”或“models / __ init __。py”中定义或导入所有模型。 否则，此时应用程序注册表可能不会完全加载，这可能会导致ORM出现故障。</p>\n<p>此步骤完成后，操作模型的 API，例如 <a class=\"reference internal\" href=\"#django.apps.apps.get_model\" title=\"django.apps.apps.get_model\"><code class=\"xref py py-meth docutils literal notranslate\">get_model()</code></a>，就可以使用了。</p>\n</li>\n<li><p>最后，Django运行每个应用程序配置的：meth：<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>〜AppConfig.ready（）`方法。</p></li>\n</ol>\n</section>\n<section id=\"troubleshooting\">\n<span id=\"applications-troubleshooting\"></span><h3>错误调试<a class=\"heading-anchor\" href=\"#troubleshooting\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>在初始化期间，这里有一些常见的错误你可能会遇上。</p>\n<ul>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/3.0/ref/exceptions/#django.core.exceptions.AppRegistryNotReady\" title=\"django.core.exceptions.AppRegistryNotReady\"><code class=\"xref py py-class docutils literal notranslate\">AppRegistryNotReady</code></a>: This happens when\nimporting an application configuration or a models module triggers code that\ndepends on the app registry.</p>\n<p>For example, <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a> uses the app\nregistry to look up translation catalogs in applications. To translate at\nimport time, you need <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\">gettext_lazy()</code></a>\ninstead. (Using <a class=\"reference internal\" href=\"/zh-hans/3.0/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a> would be a bug,\nbecause the translation would happen at import time, rather than at each\nrequest depending on the active language.)</p>\n<p>Executing database queries with the ORM at import time in models modules\nwill also trigger this exception. The ORM cannot function properly until all\nmodels are available.</p>\n<p>如果你忘记在一个单独的Python脚本中调用函数`django.setup()`，也会发生异常。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">ImportError: cannot import name ...</code> This happens if the import sequence\nends up in a loop.</p>\n<p>为了消除这些问题，您应该最大限度地减少模型模块之间的依赖关系，并在导入时尽可能减少复杂度。 为了避免在导入时执行代码，可以将其移入函数并缓存结果。 代码将在您首次需要结果时执行。 这个概念被称为“惰性求值”。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">django.contrib.admin</code> automatically performs autodiscovery of <code class=\"docutils literal notranslate\">admin</code>\nmodules in installed applications. To prevent it, change your\n<a class=\"reference internal\" href=\"/zh-hans/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> to contain\n<code class=\"docutils literal notranslate\">'django.contrib.admin.apps.SimpleAdminConfig'</code> instead of\n<code class=\"docutils literal notranslate\">'django.contrib.admin'</code>.</p></li>\n</ul>\n</section>\n</section>","rootId":"module-django.apps","toc":[{"title":"项目和应用","anchor":"projects-and-applications","children":[]},{"title":"配置应用程序","anchor":"configuring-applications","children":[{"title":"对于应用作者","anchor":"for-application-authors","children":[]},{"title":"对于应用使用者","anchor":"for-application-users","children":[]}]},{"title":"应用配置","anchor":"application-configuration","children":[{"title":"可配置属性","anchor":"configurable-attributes","children":[]},{"title":"只读属性","anchor":"read-only-attributes","children":[]},{"title":"方法","anchor":"methods","children":[]},{"title":"命名空间包作为应用程序","anchor":"namespace-packages-as-apps","children":[]}]},{"title":"注册应用","anchor":"application-registry","children":[]},{"title":"初始化进程","anchor":"initialization-process","children":[{"title":"应用是如何被加载的","anchor":"how-applications-are-loaded","children":[]},{"title":"错误调试","anchor":"troubleshooting","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API参考","url":"/zh-hans/3.0/ref/"}],"prev":{"docname":"ref/index","title":"API参考","url":"/zh-hans/3.0/ref/"},"next":{"docname":"ref/checks","title":"系统检查框架","url":"/zh-hans/3.0/ref/checks/"},"formats":{"html":"/zh-hans/3.0/ref/applications/","markdown":"/zh-hans/3.0/ref/applications.md","json":"/zh-hans/3.0/ref/applications.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/ref/applications.txt","official":"https://docs.djangoproject.com/zh-hans/3.0/ref/applications/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}