Django介绍

原文:Django Introduction
链接:Django introduction

备注:Mozzila原文界面可以切换中文,但是比较拗口或者要来回切换看代码块,我按我作为萌新去理解的方式,进行一些内容翻译和排版优化处理。

【后续超链接中的是英文,逐步按需要把这些英译中的坑填上,方便更多人快速用中文阅读理解】

在这篇Django的第一篇文章中,我们回答了“什么是Django?”的问题,并概述了是什么使这个web框架与众不同。

我们将概述主要功能,包括一些高级功能,在本模块中我们没有时间详细介绍这些功能。我们还将向您展示Django应用程序的一些主要构建块(尽管此时您还没有测试它的开发环境)。

先决条件:基本的计算机知识。对服务器端网站编程的一般理解,尤其是对网站中客户机-服务器交互机制的理解。

目标:熟悉Django是什么,它提供了什么功能,以及Django应用程序的主要构建块。

1. 什么是Django

Django 是一个高级的 Python 网络框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django负责处理网站开发中麻烦的部分,因此你可以专注于编写应用程序,而无需重新开发。
它是免费和开源的,有活跃繁荣的社区,丰富的文档,以及很多免费和付费的解决方案。

Django 可以使你的应用具有以下优点:

完备性

  • Django遵循“功能完备”的理念,提供开发人员可能想要“开箱即用”的几乎所有功能。因为你需要的一切都是一个”产品“的一部分,它们都可以无缝结合在一起,遵循一致性设计原则,并且具有广泛和最新的文档.

通用性

  • Django 可以(并已经)用于构建几乎任何类型的网站—从内容管理系统和维基,到社交网络和新闻网站。它可以与任何客户端框架一起工作,并且可以提供几乎任何格式(包括 HTML,Rss源,JSON,XML等)的内容。你正在阅读的网站就是基于Django。

  • 在内部,尽管它为几乎所有可能需要的功能(例如几个流行的数据库,模版引擎等)提供了选择,但是如果需要,它也可以扩展到使用其他组件。

安全性

  • Django 帮助开发人员通过提供一个被设计为“做正确的事情”来自动保护网站的框架来避免许多常见的安全错误。例如,Django提供了一种安全的方式来管理用户账户和密码,避免了常见的错误,比如将session放在cookie中这种易受攻击的做法(取而代之的是cookies只包含一个密钥,实际数据存储在数据库中)或直接存储密码而不是密码哈希。

  • 密码散列是通过加密散列函数发送密码而创建的固定长度值。Django可以通过哈希函数运行输入的密码,并将输出与存储的哈希值进行比较,从而检查输入的密码是否正确。但是,由于函数的“单向”性质,即使存储的哈希值被破坏,攻击者也很难计算出原始密码。

    【个人补充举例: CRM系统OKKI绑定gmail邮箱,可以用两步验证的方式,然后通过输入密码产生应用专用密码,也就是一串固定长度的密码存放到OKKI中,而实际密码是“隐藏”起来的】

  • 默认情况下,Django 可以防范许多漏洞,包括SQL注入,跨站点脚本,跨站点请求伪造和点击劫持 (如有兴趣,请参阅 网站安全 相关信息)。

可扩展

  • Django 使用基于组件的 Share-Nothing 架构即 “无共享” 架构 (架构的每一部分独立于其他架构,因此可以根据需要进行替换或更改)。在不同的部分之间有一个清晰的分离意味着它可以通过在任何级别添加硬件来扩展增加的流量:缓存服务器、数据库服务器或应用程序服务器。一些最繁忙的网站成功地扩展了Django以满足其需求(例如Instagram和Discus,仅举两个例子,可自行添加)。

可维护性

  • Django代码是使用鼓励创建可维护和可重用代码的设计原则和模式编写的。特别是,它利用了 DRY原则 (Don’t Repeat Yourself, 不要重复自己原则),因此没有不必要的重复,从而减少了代码量。Django还促进将相关功能分组到可重用的“应用程序”中,并在较低级别按照MVC模式(Model View Controller,模型视图控制器)将相关代码分组到模块中,。

      MVC (Model-View-Controller) 是一种软件设计模式.它强调分离软件的业务逻辑和显示。
      这种“分离”提供了更好的分工和改进的维护。
      一些其他的模式也是基于MVC来设计的,像 MVVM (Model-View-Viewmodel), 
      MVP (Model-View-Presenter), 和 MVW (Model-View-Whatever).
      对MVC软件设计模式的三个部分可以被描述如下:
      Model: 模型持有所有的数据、状态和程序逻辑.
      View: 负责界面的布局和显示.
      Controller: 负责模型和界面之间的交互.
    

灵活性

  • Django是用Python编写的,Python在许多平台上运行。这意味着您不必依赖于任何特定的服务器平台,可以在多种风格的Linux、Windows和Mac OS X上运行您的应用程序。此外,Django受到许多web托管提供商的良好支持,他们通常为托管Django站点提供特定的基础设施和文档。

2. Django的诞生

Django最初是由一个负责创建和维护报纸网站的网络团队在2003年至2005年间开发的。在创建了大量站点之后,团队开始考虑并重用大量通用代码和设计模式。这个通用代码演变成了一个通用的web开发框架,在2005年7月被开源为“Django”项目。

Django从2008年9月发布的第一个里程碑版本(1.0)到最近发布的版本3.1(2020),一直在不断增长和改进。每个版本都添加了新的功能和错误修复,从支持新类型的数据库、模板引擎和缓存,到添加“通用”视图函数和类(这减少了开发人员为许多编程任务编写的代码量)。

注意: 查看Django网站上 发行说明, 看看最近版本发生了什么变化,以及Django能做多少工作。

Django现在是一个蓬勃发展的、协作的开源项目,拥有数千名用户和贡献者。虽然Django仍然有一些反映其起源的特性,但它已经发展成为一个多功能的框架,能够开发任何类型的网站。

3. Django的受欢迎程度

服务器端框架的受欢迎程度,并没有任何可靠和明确的测量(尽管Hot Frameworks网站尝试使用诸如计算每个平台的GitHub项目数量和StackOverflow问题的机制来评估流行度)。一个更好的问题是Django是否“足够流行”,以避免(使用·)不受欢迎的平台的问题。它是否继续发展?如果您需要帮助,可以帮您吗?如果您学习Django,有机会获得付费工作吗?

基于使用Django的流行网站数量,为代码库贡献的人数以及提供免费和付费支持的人数,那么是的,Django是一个流行的框架!

使用Django的流行网站包括:Disqus, Instagram, Knight Foundation, MacArthur Foundation, Mozilla, National Geographic, Open Knowledge Foundation, Pinterest, and Open Stack (资料来源: Django overview page)。

4. Django的限制性

Web框架通常将自己称为“有限制”或“无限制”。

有限制框架,是对处理任何特定任务的“正确方法”持有意见的框架。他们经常支持特定领域的快速发展(解决特定类型的问题),因为正确的做法是通常被很好地理解和记录在案。然而,他们在解决其主要领域之外的问题时可能不那么灵活,并且倾向于为可以使用哪些组件和方法提供较少的选择

相比之下,无限制的框架对于将组件粘合在一起以实现目标或甚至应使用哪些组件的最佳方式的限制较少。它们使开发人员更容易使用最合适的工具来完成特定任务,尽管您需要自己查找这些组件

Django是 “部分有限制” 的框架,因此提供了 “(有限制/无限制)两者的最佳” 。它提供了一组组件来处理大多数Web开发任务和一个(或两个)首选的使用方法。然而,Django的解耦架构意味着您通常可以从多个不同的选项中进行选择,也可以根据需要添加对全新选项的支持。

5. Django代码样式

在传统的数据驱动网站中,Web应用程序会等待来自Web浏览器(或其他客户端)的 HTTP 请求。当接收到请求时,应用程序根据 URL 和可能的 POST 数据或 GET 数据中的信息确定需要的内容。根据需要,可以从数据库读取或写入信息,或执行满足请求所需的其他任务。然后,该应用程序将返回对Web浏览器的响应,通常通过将检索到的数据插入 HTML模板中的占位符来动态创建用于浏览器显示的 HTML 页面。

Django 网络应用程序,通常将处理每个步骤的代码分组到单独的文件中:
Django web applications typically group the code

  • URLs: 虽然可以通过单个功能来处理来自每个URL的请求,但是编写单独的视图函数来处理每个资源是更加可维护的。URL映射器用于根据请求URL将HTTP请求重定向到相应的视图。URL映射器还可以匹配出现在URL中的字符串或数字的特定模式,并将其作为数据传递给视图功能。

  • View: 视图 是一个请求处理函数,它接收HTTP请求并返回HTTP响应。视图通过模型访问满足请求所需的数据,并将响应的格式委托给 模板。

  • Models: 模型 是定义应用程序数据结构的Python对象,并提供在数据库中管理(添加,修改,删除)和查询记录的机制。

  • Templates: 模板 是定义文件(例如HTML页面)的结构或布局的文本文件,用于表示实际内容的占位符。一个视图可以使用HTML模板,从数据填充它动态地创建一个HTML页面模型。可以使用模板来定义任何类型的文件的结构; 它不一定是HTML!

      注意: Django将此组织称为“模型视图模板(MVT)”架构。
      它与更加熟悉的 [Model View Controller](https://developer.mozilla.org/en-US/docs/Glossary/MVC) 架构有许多相似之处. 
    

以下部分将为您提供Django应用程序的这些主要部分的想法(稍后我们将在进一步详细介绍后,我们将在开发环境中进行更详细的介绍)。

将请求发送到正确的视图 (urls.py)

URL映射器通常存储在名为urls.py的文件中。在下面的示例中,mapper(url patterns)定义了特定URL 模式 和相应视图函数之间的映射列表。如果接收到具有与指定模式匹配的URL的HTTP请求,则将调用 相关联的视图功能并传递请求。
URL映射器通常存储在名为URL.py的文件中。在下面的示例中,映射器mapper(urlpatterns)定义了路由 routes(特定URL模式)和相应视图函数之间的映射列表。如果收到的HTTP请求具有与指定模式匹配的URL(例如r’^$’,下面代码所示),则将调用关联的view函数(例如 views.index)并传递该请求。

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/<int:id>/', views.book_detail, name='book_detail'),
    path('catalog/', include('catalog.urls')),
    re_path(r'^([0-9]+)/$', views.best),
]

注意一点点Python知识:

  • 该 urlpatterns 对象的列表url() 功能。在Python中,使用方括号定义列表。项目以逗号分隔,并可能有一个 可选的逗号. 例如: [item1, item2, item3,].
  • 该模式的奇怪的语法称为正则表达式。我们将在后面的文章中讨论这些内容!
  • 第二个参数 url() 是当模式匹配时,将被调用的另一个函数。符号views.index 表示该函数被调用,index()并且可以在被调用的模块中找到views (即在一个名为views.py的文件中)。

处理请求 (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!')

注意: 一点点Python:

  • Python 模块 是函数的“库”,存储在单独的文件中,我们可能想在我们的代码中使用它们。在这里我们只从django.http模块导入了HttpResponse对象,使我们可以在视图中使用它:
    from django.http import HttpResponse。
    还有其他方法可以从模块导入一些或所有对象。
  • 如上所示,使用def关键字声明函数,在函数名称后面的括号中列出命名参数;整行以冒号结尾。注意下一行是否都进行了缩进。缩进很重要,因为它指定代码行在该特定块内 (强制缩进是Python的一个关键特征,也是Python代码很容易阅读的一个原因)。

视图通常存储在一个名为 views.py 的文件中。

定义数据模型 (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')

注意: Python小知识:

  • Python支持“面向对象编程”,这是一种编程风格,我们将代码组织到对象中,其中包括用于对该对象进行操作的相关数据和功能。对象也可以从其他对象继承/扩展/派生,允许相关对象之间的共同行为被共享。在Python中,我们使用关键字 Class 定义对象的“蓝图”。我们可以根据类中的模型创建类型的多个 特定 实例。

  • 例如,我们有个 Team 类,它来自于Model类。这意味着它是一个模型,并且将包含模型的所有方法,但是我们也可以给它自己的专门功能。在我们的模型中,我们定义了我们的数据库需要存储我们的数据字段,给出它们的具体名称。Django使用这些定义(包括字段名称)来创建底层数据库。

查询数据 (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 templates)

模板系统允许您使用占位符指定输出文档的结构,占位符用于生成页面时填充的数据。模板通常用于创建HTML,但也可以创建其他类型的文档。Django既支持其本机模板系统,也支持另一个流行的Python库,称为Jinja2开箱即用(如果需要,还可以使其支持其他系统)。

代码片段显示了上一节中render()函数调用的HTML模板的外观。此模板是在这样的假设下编写的,即在呈现时,它将有权访问名为yougest_teams的列表变量(该变量包含在上面render()函数中的上下文变量中)。在HTML框架中,我们有一个表达式,它首先检查youngest_teams变量是否存在,然后在for循环中迭代它。在每次迭代中,模板在

  • 元素中显示每个团队的团队名称值。
  • ## filename: best/templates/best/index.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>Home page</title>
    </head>
    <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代码,但与客户端代码不同,您需要设置一个开发环境来运行它。这是我们的下一步。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值