设计理念

This document explains some of the fundamental philosophies Django's developers have used in creating the framework. Its goal is to explain the past and guide the future.

总体

松耦合

A fundamental goal of Django's stack is loose coupling and tight cohesion. The various layers of the framework shouldn't "know" about each other unless absolutely necessary.

For example, the template system knows nothing about Web requests, the database layer knows nothing about data display and the view system doesn't care which template system a programmer uses.

Although Django comes with a full stack for convenience, the pieces of the stack are independent of another wherever possible.

更少的代码

Django apps should use as little code as possible; they should lack boilerplate. Django should take full advantage of Python's dynamic capabilities, such as introspection.

快速开发

The point of a Web framework in the 21st century is to make the tedious aspects of Web development fast. Django should allow for incredibly quick Web development.

不要重复自己 (DRY)

Every distinct concept and/or piece of data should live in one, and only one, place. Redundancy is bad. Normalization is good.

The framework, within reason, should deduce as much as possible from as little as possible.

明确优于隐式

This is a core Python principle listed in PEP 20, and it means Django shouldn't do too much "magic." Magic shouldn't happen unless there's a really good reason for it. Magic is worth using only if it creates a huge convenience unattainable in other ways, and it isn't implemented in a way that confuses developers who are trying to learn how to use the feature.

一致性

The framework should be consistent at all levels. Consistency applies to everything from low-level (the Python coding style used) to high-level (the "experience" of using Django).

模型

明确优于隐式

Fields shouldn't assume certain behaviors based solely on the name of the field. This requires too much knowledge of the system and is prone to errors. Instead, behaviors should be based on keyword arguments and, in some cases, on the type of the field.

包括所有相关领域逻辑

Models should encapsulate every aspect of an "object," following Martin Fowler's Active Record design pattern.

This is why both the data represented by a model and information about it (its human-readable name, options like default ordering, etc.) are defined in the model class; all the information needed to understand a given model should be stored in the model.

数据库API

数据库API的主要用处:

SQL效率

It should execute SQL statements as few times as possible, and it should optimize statements internally.

This is why developers need to call save() explicitly, rather than the framework saving things behind the scenes silently.

This is also why the select_related() QuerySet method exists. It's an optional performance booster for the common case of selecting "every related object."

简洁, 强大的语法

The database API should allow rich, expressive statements in as little syntax as possible. It should not rely on importing other modules or helper objects.

当必要时, 在幕后插入应该是自动进行的.

每一个对象都应该能够访问所有相关的目的, 系统范围. 这种访问应该是双向的.

当需要时, 选项​​降回原始的SQL是容易的

The database API should realize it's a shortcut but not necessarily an end-all-be-all. The framework should make it easy to write custom SQL -- entire statements, or just custom WHERE clauses as custom parameters to API calls.

URL设计

松耦合

URLs in a Django app should not be coupled to the underlying Python code. Tying URLs to Python function names is a Bad And Ugly Thing.

Along these lines, the Django URL system should allow URLs for the same app to be different in different contexts. For example, one site may put stories at /stories/, while another may use /news/.

无限的灵活性

URLs should be as flexible as possible. Any conceivable URL design should be allowed.

鼓励最佳实践

The framework should make it just as easy (or even easier) for a developer to design pretty URLs than ugly ones.

File extensions in Web-page URLs should be avoided.

Vignette-style commas in URLs deserve severe punishment.

定义URL

Technically, foo.com/bar and foo.com/bar/ are two different URLs, and search-engine robots (and some Web traffic-analyzing tools) would treat them as separate pages. Django should make an effort to "normalize" URLs so that search-engine robots don't get confused.

This is the reasoning behind the APPEND_SLASH setting.

模板系统

演示不同的逻辑

We see a template system as a tool that controls presentation and presentation-related logic -- and that's it. The template system shouldn't support functionality that goes beyond this basic goal.

避免冗余

The majority of dynamic websites use some sort of common sitewide design -- a common header, footer, navigation bar, etc. The Django template system should make it easy to store those elements in a single place, eliminating duplicate code.

This is the philosophy behind template inheritance.

从HTML中解耦

The template system shouldn't be designed so that it only outputs HTML. It should be equally good at generating other text-based formats, or just plain text.

XML不应被用于模板语言

Using an XML engine to parse templates introduces a whole new world of human error in editing templates -- and incurs an unacceptable level of overhead in template processing.

假设设计能力

The template system shouldn't be designed so that templates necessarily are displayed nicely in WYSIWYG editors such as Dreamweaver. That is too severe of a limitation and wouldn't allow the syntax to be as nice as it is. Django expects template authors are comfortable editing HTML directly.

对待空格很明显

The template system shouldn't do magic things with whitespace. If a template includes whitespace, the system should treat the whitespace as it treats text -- just display it. Any whitespace that's not in a template tag should be displayed.

不要发明一种编程语言

The goal is not to invent a programming language. The goal is to offer just enough programming-esque functionality, such as branching and looping, that is essential for making presentation-related decisions. The Django Template Language (DTL) aims to avoid advanced logic.

The Django template system recognizes that templates are most often written by designers, not programmers, and therefore should not assume Python knowledge.

安全与保障

开箱即用的模板系统禁止包含恶意代码,例如删除数据库记录的代码。

这就是模板系统不允许有任意Python代码的另一个原因。

可扩展性

模板系统应该认识到, 高阶的模板作者可能想扩展它.

这是自定义的模板标签和过滤器背后的理念.

视图

简洁

编写视图应该和编写Python函数一样简单。开发人员不应该在函数执行时实例化一个类。

使用请求对象

Views should have access to a request object -- an object that stores metadata about the current request. The object should be passed directly to a view function, rather than the view function having to access the request data from a global variable. This makes it light, clean and easy to test views by passing in "fake" request objects.

松耦合

A view shouldn't care about which template system the developer uses -- or even whether a template system is used at all.

GET方法和POST方法的区别

GET and POST are distinct; developers should explicitly use one or the other. The framework should make it easy to distinguish between GET and POST data.

缓存框架

The core goals of Django's cache framework are:

更少的代码

A cache should be as fast as possible. Hence, all framework code surrounding the cache backend should be kept to the absolute minimum, especially for get() operations.

一致性

The cache API should provide a consistent interface across the different cache backends.

可扩展性

The cache API should be extensible at the application level based on the developer's needs (for example, see Cache key transformation).