什么字面上定义了一个django应用程序?

时间:2015-06-27 00:39:22

标签: python django django-apps

我已经阅读了一些关于“app”应该在django中意味着什么的问题,但是它们会进入应用程序的通用/使用,这很重要,但不是应用字面上的“是”。例如,我今天感受到了好奇心

  1. 我删除了一个用django-admin startapp作为应用程序安装的文件夹,并收到一个错误,stackO告诉我是由于我的INSTALLED_APPS中存在已删除的应用名称。清除名称后,我的应用程序再次运行

  2. 在项目的最高级别使文件夹冷(只是mkdir,没有startapp)时,当尝试从真实应用程序导入名称时,我必须将我的项目添加到sys.path列表才能够进口。将此文件夹重命名为应用后,导入不再是问题

  3. 我已经阅读过有关此主题的问题,其评论包含“好的,我有一个models.py文件,所以它是一个应用程序”,似乎很少有人真正理解应用程序的启动方式。

    我的问题是,

    1. 我有什么余地来修改django制作的应用程序?我可以删除它附带的所有文件(init除外)并使其成为没有视图和模型的冷库吗?是否需要 init 以外的任何文件才能正常运行?

    2. 当我运行startapp导致应用程序可以自动导入时,django做了什么,当我在其中创建一个带有 init 的文件夹时,效果不存在(正如我所说的那样)需要将项目路径添加到该文件夹​​中的sys.path。换句话说,django命令“startapp”实际上用来注册应用程序是什么?这个动作在django.core.management.templates.py中,我今天读了它,看到了TemplateCommand.handle()中引用应用程序或项目名称的东西,但是看不清楚它是如何注册它们的。它导入sys,但搜索“sys.module”不在文件

    3. 如果我想将一个带有 init 的空目录转换为一个应用程序,我需要做什么才能在不执行startapp的情况下进行此更改?

    4. 谢谢

1 个答案:

答案 0 :(得分:5)

TLDR:Django应用程序只是项目中的Python包,除了__init__.py之外,您不需要任何文件来导入它。

我也经历了这个模糊的解释" app"来自Django的文档,它让我看看什么是一个" web应用程序"在一般方案中,在我开始时我能理解Django的概念之前。

通常定义的是,Web应用程序是通过浏览器从服务器传输到客户端的任何程序。这可以是整个网站,网站中的某个组件(想想验证码,小部件,OAuth等),也可以是网站的功能(例如与其他技术集成,例如将页面导出为PDF)。这些可以是模块化组件,也可以不是,可移植或不可移植,并且在项目的源代码中是不同的或与其他东西混合。

由于一般"网络应用程序"定义很模糊,可能更容易想象" Django app。"您的项目包含一个或多个应用程序,其中一些应用程序可能包含文件。 从技术上讲,您的应用可以包含除__init__.py之外的任何内容,但仍然可以导入(它只是一个普通的Python包,尽管是无用的)。你可以使它成为一个包含其他模块的库,但这似乎是单声道的,我尽可能地将业务逻辑与我的网站源代码分开。

应用程序只是为您的项目做些事情的东西。许多人,包括我自己,想要定义一个应用程序,这个问题是"它做了什么?"如果您无法以简洁的方式回答此问题(不包括"和#34;)那么您的应用可能会被分成几个不同的部分。建议您这样做,但如果您真的需要,可能会违反此规则。在我的第一个Django项目中,我将整个网站放在一个app文件夹中。这成了管理的噩梦,但我做到了。

视图和模型只是在一个地方存储您需要为该应用程序使用的信息的地方;如果您的整个网站只有一个大应用程序,那么事情会很快变得混乱和无法管理。那当然是unpythonic,而且Django的开发人员非常注重正确地制作东西。"

至于技术细节,Django项目是包。您可以使用manage.py startproject并在之前/之后检查sys.path。应用程序也是包,其中(据称)包含允许您的应用程序"执行其预期的功能。您可以将它们用于任何事物,一切事物或根本没事,但它们只是一个Python软件包,模块位于系统的整齐小文件夹中,可以为您的项目执行某些操作。

如果您还没有,可以在Django文档here中找到应用程序的快速概述。此外,这都是我的基本理解的产物,所以如果我的答案的任何部分有任何问题,请告诉我。