学习Tango with django(1)
综述
这本书的目的是为你提供使用python和django进行web开发的一个较为实用的向导。本书对象主要针对学生,手把手教你通过django进行web开发。
这本书是作为django官方教程和网上其他优秀教程的补充,填充了django官方文档的许多空白,提供了一种基于案例设计驱动去学习django框架的方法。此外,这本书还介绍了进行web开发还需要掌握的其它方面(如HTML,CSS,JavaScript等)。
为什么选择这本书
这本书会节省你的时间。我们在很多场合看到学生花费了很多时间学习django和其他web开发知识,产生这样问题的原因多半是一些关键信息未提供或者不明确。有时候解决这些问题要10-15分钟,有时候得要数小时。这本书尽可能的删除这些障碍,这样你就不至于磕磕绊绊的学习django框架了。
这本书会缩短学习曲线。使用web框架进行开发会节省很多时间,避免不必要的困扰,但是前提是你得会用,而一般学习曲线都是陡峭的。这本书尝试解释所有模块是怎样组合在一起,并让你快速掌握。
这本书将改进你的工作流程。使用web框架需要你掌握一些特殊的设计模式,这样你只能在特定的地方填写特定的东西。我们听到过很多学生关于web框架的牢骚,特别是这些框架如何控制他们的。所以我们创作了一些工作流程,让你关注于开发过程,这样你就能重新得到控制并进行规范的开发了。
这本书不是用来读的!不管你在干嘛,都不要读这本书。你需要手写代码开发应用。为了提高你的水平,请敲代码来学习。当你写程序时,不要复制粘贴代码。先自己敲下试试,思考该怎么做,然后在看这本书提供的方案。如果你还是没搞懂,查阅一下django的官方文档,去Stack Overflow或者其它有用的网站,弥补你知识的空白点。如果你确实没办法了,联系我们,我们或许需要改下源码-我们已经得到许多读者的贡献了。
你会学到什么
这本书提供了一个例子进行学习,会为你演示怎么设计一个叫Rango的web应用。在此过程中,我们会你展现如何完成如下的关键任务。
- 怎样搭建你的开发环境-包括怎样使用终端、虚拟环境、pip安装器、如何使用Git等等。
- 创建django项目并创建一个基本应用
- 配置django项目-让静态文件生效
- 使用django的模型-视图-模板设计模式
- 创建数据库模型并使用django提供的ORM
- 创建表单,利用数据库模型动态的生成页面
- 使用由django提供的用户认证模块
- 将外部应用融入到你的django应用
- 包括web开发需要的CSS和javascript
- 使用CSS使你的应用专业美观
- 使用django的cookie和session
- 包括一些高级功能如AJAX
- 使用PythonAnywhere开发应用
每个章节结束我们都会提供几个练习供你加深印象并检查你是否会运用你所学的。接下来的章节会提供几个开源的开发练习,包括实现代码和解释。
提供的章节会向这样展示
每个章节结束我们都会提供练习测试你的知识技巧,你必须完成这些练习,因为接下来的章节讲解都需要这些练习。如果你确实卡住了,别担心,你可以从我们的GitHub repository上获取所有练习的解决方法。
需要用到的技术和库
这本会用到各种各样包括以下的技术和库:
- python编程语言
- PIP包管理器
- Django
- Git版本控制系统
- HTML
- CSS
- JavaScript
- JQuery库
- Bootstrap前端框架
- Webhose API(作为搜索API)
- PythonAnywhere~~主机服务~~
我们之所以选择上述技术,一方面因为这些既是基本上都是现在web开发的基础了,一方面这些技术提供了供我们学习的例子,比如用Bootstrap将CSS与你的应用整合、用Webhose API扩展库、用PythonAnywhere快捷的部署你的应用。
Rango:初步设计规范
这本书着重于开发一个叫Rango的应用,当我们开发这个应用程序时,它将包括在构建任何Web应用程序时都需要开发的核心组件。如果需要查看应用的完整版,可以访问How to Tango with Django website.
设计简介
你希望创建一个网页叫Range,让不同的用户访问不同的网页,在西班牙语中,单词Rango意思是“a league ranked by quality” 或者“a position in a social hierarchy”.
- Rango的主页上希望可以让访问者看到如下信息:
- 最多五个访问页面;
- 最多五个分类;
- 提供某种方法让访问者可以浏览或者搜索分类。
- 当用户访问一个分类页面,页面应该展现如下内容:
- 分类名称,访问数,点赞数,分类相关页面的信息列表,如页面标题,链接的URL
- 提供搜索功能查找链接到其它页面的分类;
- 对一些特殊功能的分类,客户端页面应该能记录分类的名称,每个页面被访问的次数以及有多少用户点击了赞。
- 每个分类都应该可以通过可读性好的URL理解分类的用途,比如/rango/books-aboutdjango/。
- 只有注册用户才能搜索和添加页面到分类,因此访客应该可以通过页面注册用户。
乍看之下,要开发的应用似乎相当的简单,确实这个应用只不过是一些分类链接到页面上。但是实际上需要面临很多复杂的问题和挑战。首先,让我们先放下那些高级的设计方法,先简单的思考下哪些功能需要开发。
练习
在继续之前,先思考下如下的设计要求并画出设计思路。
- 一个N-Tier或者系统架构图表
- 主要分类页面设计
- URL到应用的映射
- ER图来描述要实现的数据模型
即使你现在不熟悉系统架构图、线框图、ER图,在继续之前也试着做下这些练习,这些表可以解释和描述你要建造什么。
N层架构
大多数web应用比较高级的架构都是3层架构,Rango是这种架构的变种,因为它还与外部服务交互。
Rango应用3层架构
因为我们用django来开发应用,所以我们用下面的技术实现每一层
- client是渲染HTML/CSS页面的浏览器。
- middleware将是一个django应用,在我们开发过程中,由django内置的开发服务器管理。
- database是基于python的SQLite3数据库引擎。
- search API将使用search API。
这本书很大一部分着重于开发中间件。但是从系统架构图中可以清楚地看到,我们还得和所有其他组件进行交互。
线框图
当应用完成时应该是什么样子,线框图提供了一种很好的展现方法。从手绘草图到使用工具创建精确的模型,线框图都能节约时间。对于我们的Rango应用来说,我们希望主页面和分类页面能有如下效果。
主页面左边有个分类搜索栏,主页面上显示五个页面和五个分类
分类页面显示分类里的页面(包括视图数量),页面下方有一个基于python的搜索栏,搜索结果显示在下方。
页面和URL映射
根据设计说明,我们已经设计了在不同点展现给用户不同结果的两个页面。我们需要设计URL映射来准确访问对应的网页,URL映射就是用户必须在浏览器地址栏输入地址才能到达给定页面的文本。Rango的URL映射如下所示。
- / 或者/rango/ 将会指向主页/。
- /rango/about 会指向关于页面。
- /rango/category// 会指向名为的分类页面,分类有可能是:
- games;
- python-recipes;
- code-and-compilers.
在开发应用的过程中需要创建很多URL映射,上面的例子只是一个开始。在我们学习这本书的过程中,我们将会用django框架和其设计模式模型-视图-模板来构造这些页面。现在既然我们已经定义了URL映射和页面的展现内容,我们就需要定义数据模型来存储我们应用的数据。
### 实体关系表
根据设计说明,我们至少得设计两个模型:分类和页面。当然分类可以存储喝多页面,我们可以构造如下的ER图来描述这个数据类型。
Rango两个模型的ER表展现
注意设计说明是很模糊的,单个页面理论上是可以存在于单个或多个分类的,基于这个假设,我们需要将分类和页面设计为多对多关系,但是这种关系非常复杂,所以我们基于一个简单的假设,即一个分类可以包含多个页面,但是一个页面只能分配给一个分类,这并不能防止了一个页面出现在两个不同分类的情况 - 在不理想的情况下,页面可能进入两次。
笔记
要养成一个记录自己做过假设的习惯,比如我们在上面假设的一对多关系模型。你不可能知道这些假设回头会产生什么问题。你可以同你的开发团队沟通假设是否合理。
基于这些假设,我们开始为模型设计内容更加详细的表结构,这些表结构定义了每个模型需要定义哪些字段。我们使用django的ModelField类型来定义每个模型的字段类型(比如整型、字符型、URL型、外键)。注意django自动为每个模型添加一个主键id,稍后在模型和数据库章节我们再进一步讨论。
分类模型
字段 | 类型 |
---|---|
name | CharField |
views | IntegerField |
likes | IntegerField |
页面模型
字段 | 类型 |
---|---|
category | ForeignKey |
views | IntegerField |
title | CharField |
url | URLField |
我们还有一个用来注册登录的用户模型,这里我们先不显示,稍后等讨论用户认证的时候在介绍。在接下来的章节中,我们会介绍如何实例化这些模型,以及如何使用内置的ORM连接数据库。
总结
创建应用时高级设计说明有很大的参考价值,虽然我们接下来会着重介绍特定的技术,但这些技术对于大多是数据库驱动网站来说都差不多。掌握如何阅读和生成这些设计说明是个不错的主意,这样你就可以将你的设计想法和其他人交流了。这里我们专注于使用django和其它相关技术来实现我们的应用。
剪切粘贴编程
在你学习这本书是,你很有可能会复制粘贴代码来练习编程,但是最好还是手敲代码,我们知道这很麻烦,但是这会帮助你更好的记住这些过程和你以后会用到的命令。
此外,复制粘贴python代码还会有问题,空白字符最终可能会被解释成空格、tab或者是空格和tab混合的字符串,这都会产生各种各样怪异的错误,不一定是缩进错误。如果你确实复制粘贴了,要注意这一点。如果你用的是python3,那就要更加留神了-在你的代码中混合使用tab和空格会产生TabError
许多代码编辑器都能显示空白字符是tab还空格,如果有就打开这个功能,这样能避免很多困扰。