Django框架入门:从基础概念到核心组件详解
Django框架入门:从基础概念到核心组件详解
Django是一个功能强大且灵活的Python Web框架,可以帮助开发者快速构建安全、可维护的网站。本文将带你了解Django的基本概念、主要特点以及其核心组件的工作原理。
Django是什么?
Django是一个高级的Python Web框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django负责处理网站开发中麻烦的部分,因此你可以专注于编写应用程序,而无需重新开发。 它是免费和开源的,有活跃繁荣的社区,丰富的文档,以及很多免费和付费的解决方案。
Django可以使你的应用具有以下优点:
完备性:Django遵循“功能完备”的理念,提供开发人员可能想要“开箱即用”的几乎所有功能。因为你需要的一切都是一个”产品“的一部分,它们都可以无缝结合在一起,遵循一致性设计原则,并且具有广泛和最新的文档。
通用性:Django可以(并已经)用于构建几乎任何类型的网站—从内容管理系统和维基,到社交网络和新闻网站。它可以与任何客户端框架一起工作,并且可以提供几乎任何格式(包括HTML,Rss源,JSON,XML等)的内容。你正在阅读的网站就是基于Django。
安全性:Django帮助开发人员通过提供一个被设计为“做正确的事情”来自动保护网站的框架来避免许多常见的安全错误。例如,Django提供了一种安全的方式来管理用户账户和密码,避免了常见的错误,比如将session放在cookie中这种易受攻击的做法(取而代之的是cookies只包含一个密钥,实际数据存储在数据库中)或直接存储密码而不是密码哈希。
可扩展性:Django使用基于组件的“无共享”架构(架构的每一部分独立于其他架构,因此可以根据需要进行替换或更改)。在不用部分之间有明确的分隔意味着它可以通过在任何级别添加硬件来扩展服务:缓存服务器,数据库服务器或应用程序服务器。一些最繁忙的网站已经成功地缩放了Django,以满足他们的需求(例如Instagram和Disqus,仅举两个例子,可自行添加)。
可维护性:Django代码编写是遵照设计原则和模式,鼓励创建可维护和可重复使用的代码。特别是它使用了不要重复自己(DRY)原则,所以没有不必要的重复,减少了代码的数量。Django还将相关功能分组到可重用的“应用程序”中,并且在较低级别将相关代码分组或模块(模型视图控制器(MVC)模式)。
灵活性:Django是用Python编写的,它在许多平台上运行。这意味着你不受任务特定的服务器平台的限制,并且可以在许多种类的Linux,Windows和MacOsX上运行应用程序。此外,Django得到许多网络托管提供商的好评,他们经常提供特定的基础设施和托管Django网站的文档。
Django的诞生
Django最初由2003年到2005年间由负责创建和维护报纸网站的网络团队开发。在创建了许多网站后,团队开始考虑并重用许多常见的代码和设计模式。这个共同的代码演变一个通用的网络开发框架,2005年7月被开源“Django”项目。
Django不断发展—从2008年9月的第一个里程碑版本(1.0)到最近发布的(1.11)-(2017)版本。每个版本都添加了新功能和错误修复,从支持新类型的数据库,模版引擎和缓存,到添加“通用”视图函数和类(这减少了开发人员必须编写的代码量)一些编程任务。
Django有多受欢迎?
服务器端框架的受欢迎程度没有任何可靠和明确的测量(尽管Hot Frameworks网站尝试使用诸如计算每个平台的GitHub项目数量和StackOverflow问题的机制来评估流行度)。一个更好的问题是Django是否“足够流行”,以避免不受欢迎的平台的问题。它是否继续发展?如果你需要帮助,可以帮你吗?如果你学习Django,有机会获得付费工作吗?
基于使用Django的流行网站数量,为代码库贡献的人数以及提供免费和付费支持的人数,那么是的,Django是一个流行的框架!
使用Django的流行网站包括:Disqus,Instagram,骑士基金会,麦克阿瑟基金会,Mozilla,国家地理,开放知识基金会,Pinterest和开放栈(来源:Django home page)。
Django是什么样的?
Web框架通常将自己称为“特定”或“无限制”。
特定框架是对处理任何特定任务的“正确方法”有意见的框架。他们经常支持特定领域的快速发展(解决特定类型的问题),因为正确的做法是通常被很好地理解和记录在案。然而,他们在解决其主要领域之外的问题时可能不那么灵活,并且倾向于为可以使用哪些组件和方法提供较少的选择。
相比之下,无限制的框架对于将组件粘合在一起以实现目标或甚至应使用哪些组件的最佳方式的限制较少。它们使开发人员更容易使用最合适的工具来完成特定任务,尽管你需要自己查找这些组件。
Django“有点有意义”,因此提供了“两个世界的最佳”。它提供了一组组件来处理大多数Web开发任务和一个(或两个)首选的使用方法。然而,Django的解耦架构意味着你通常可以从多个不同的选项中进行选择,也可以根据需要添加对全新的支持。
Django代码是什么样的?
在传统的数据驱动网站中,Web应用程序会等待来自Web浏览器(或其他客户端)的HTTP请求。当接收到请求时,应用程序根据URL和可能的POST数据或GET数据中的信息确定需要的内容。根据需要,可以从数据库读取或写入信息,或执行满足请求所需的其他任务。然后,该应用程序将返回对Web浏览器的响应,通常通过将检索到的数据插入HTML模板中的占位符来动态创建用于浏览器显示的HTML页面。
Django网络应用程序通常将处理每个步骤的代码分组到单独的文件中:
URLs:虽然可以通过单个功能来处理来自每个URL的请求,但是编写单独的视图函数来处理每个资源是更加可维护的。URL映射器用于根据请求URL将HTTP请求重定向到相应的视图。URL映射器还可以匹配出现在URL中的字符串或数字的特定模式,并将其作为数据传递给视图功能。
View:视图是一个请求处理函数,它接收HTTP请求并返回HTTP响应。视图通过模型访问满足请求所需的数据,并将响应的格式委托给模板。
Models:模型是定义应用程序数据结构的Python对象,并提供在数据库中管理(添加,修改,删除)和查询记录的机制。
Templates:模板是定义文件(例如HTML页面)的结构或布局的文本文件,用于表示实际内容的占位符。一个视图可以使用HTML模板,从数据填充它动态地创建一个HTML页面模型。可以使用模板来定义任何类型的文件的结构;它不一定是HTML!
将请求发送到正确的视图(urls.py)
URL映射器通常存储在名为urls.py的文件中。在下面的示例中,mapper(urlpatterns)定义了特定URL模式和相应视图函数之间的映射列表。如果接收到具有与指定模式匹配的URL(例如r'^$',下面)的HTTP请求,则将调用关联的视图功能(例如views.index)并传递请求。
urlpatterns = [
url(r'^$', views.index),
url(r'^([0-9]+)/$', views.best),
]
处理请求(views.py)
视图是Web应用程序的核心,从Web客户端接收HTTP请求并返回HTTP响应。在两者之间,他们编制框架的其他资源来访问数据库,渲染模板等。
下面的例子显示了一个最小的视图功能index(),这可以通过我们的URL映射器在上一节中调用。像所有视图函数一样,它接收一个HttpRequest对象作为参数(request)并返回一个HttpResponse对象。在这种情况下,我们对请求不做任何事情,我们的响应只是返回一个硬编码的字符串。我们会向你显示一个请求,在稍后的部分中会提供更有趣的内容。
## filename: views.py (Django view functions)
from django.http import HttpResponse
def index(request):
# Get an HttpRequest - the request parameter
# perform operations using information from the request.
# Return HttpResponse
return HttpResponse('Hello from Django!')
定义数据模型(models.py)
Django Web应用程序通过被称为模型的Python对象来管理和查询数据。模型定义存储数据的结构,包括字段类型以及字段可能的最大值,默认值,选择列表选项,文档帮助文本,表单的标签文本等。模型的定义与底层数据库无关——你可以选择其中一个作为项目设置的一部分。一旦你选择了要使用的数据库,你就不需要直接与之交谈——只需编写模型结构和其他代码,Django可以处理与数据库通信的所有辛苦的工作。
下面的代码片段为Team对象展示了一个非常简单的Django模型。本Team类是从Django的类派生models.Model。它将团队名称和团队级别定义为字符字段,并为每个记录指定了要存储的最大字符数。team_level可以是几个值中的一个,因此,我们将其定义为一个选择字段,并在被展示的数据和被储存的数据之间建立映射,并设置一个默认值。
# filename: models.py
from django.db import models
class Team(models.Model):
team_name = models.CharField(max_length=40)
TEAM_LEVELS = (
('U09', 'Under 09s'),
('U10', 'Under 10s'),
('U11', 'Under 11s'),
... #list other team levels
)
team_level = models.CharField(max_length=3,choices=TEAM_LEVELS,default='U11')
查询数据(views.py)
Django模型提供了一个用于搜索数据库的简单查询API。这可以使用不同的标准(例如,精确,不区分大小写,大于等等)来匹配多个字段,并且可以支持复杂语句(例如,你可以在拥有一个团队的U11团队上指定搜索名称以“Fr”开头或以“al”结尾)。
代码片段显示了一个视图函数(资源处理程序),用于显示我们所有的U09团队。粗体显示如何使用模型查询API过滤所有记录,其中该team_level字段具有正确的文本“U09”(请注意,该条件如何filter()作为参数传递给该函数,该字段名称和匹配类型由双下划线:team_level__exact)。
## filename: views.py
from django.shortcuts import render
from .models import Team
def index(request):
list_teams = Team.objects.filter(team_level__exact="U09")
context = {'youngest_teams': list_teams}
return render(request, '/best/index.html', context)
此功能使用render()功能创建HttpResponse发送回浏览器的功能。这个函数是一个快捷方式;它通过组合指定的HTML模版和一些数据来插入模版(在名为“context”的变量中提供)来创建一个HTML文件。在下一节中,我们将介绍如何在其中插入数据以创建HTML。
呈现数据(HTML模版)
模版系统允许你指定输出文档的结构,使用占位符{% if youngest_teams%}来生成页面时填写的数据。模版通常用于创建HTMl,但也可以创建其他类型的文档。Django支持其原生模版系统和另一种流行的Python库(称为jinja2)开箱即用(如果需要,也可以支持其他系统)。
代码片段显示render()了上一节中函数调用的HTML模版的外观。这个模版已经被写入这样的想法,即它将被访问一个列表变量,youngest_teams当它被渲染时
## filename: best/templates/best/index.html
<!DOCTYPE html>
<html lang="en">
<body>
{% if youngest_teams %}
<ul>
{% for team in youngest_teams %}
<li>{{ team.team_name }}</li>
{% endfor %}
</ul>
{% else %}
<p>No teams are available.</p>
{% endif %}
</body>
</html>
你还能做什么?
前面的部分显示了几乎每个Web应用程序将使用的主要功能:URL映射,视图,模型和模板。Django提供的其他内容包括:
表单:HTML表单用于收集用户数据以便在服务器上进行处理。Django简化了表单创建,验证和处理。
用户身份验证和权限:Django包含了一个强大的用户身份验证和权限系统,该系统已经构建了安全性。
缓存:与提供静态内容相比,动态创建内容需要更大的计算强度(也更缓慢)。Django提供灵活的缓存,以便你可以存储所有或部分的页面。如无必要,不会重新呈现网页。
管理网站:当你使用基本骨架创建应用时,就已经默认包含了一个Django管理站点。它十分轻松地创建了一个管理页面,使网站管理员能够创建、编辑和查看站点中的任何数据模型。
序列化数据:Django可以轻松地将数据序列化,并支持XML或JSON格式。这会有助于创建一个Web服务(Web服务指数据纯粹为其他应用程序或站点所用,并不会在自己的站点中显示),或是有助于创建一个由客户端代码处理和呈现所有数据的网站。
概要
恭喜,你已经完成了Django之旅的第一步!你现在应该了解Django的主要优点,一些关于它的历史,以及Django应用程序的每个主要部分可能是什么样子。你还应该了解Python编程语言的一些内容,包括列表,函数和类的语法。
你已经看到上面的一些真正的Django代码,但与客户端代码不同,你需要设置一个开发环境来运行它。这是我们的下一步。