为什么要学习Django?

知Python者必知Django, 因为这可是Python语言里最流行&强大的Web框架,同时亦是全球第5大WEB框架,可快速构建稳定强大的WEB项目,大大提高开发效率,很多知名项目都是基于Django开发,如Disqus、Pinterest、Instagram、Bitbucket等, Django官方Slogan是The framework for perfectionist with deadline! 一个为完美主义者且又开发工期很紧的人设计的框架,事实确实如此,Django自身集成了丰富的WEB开发通用组件,如用户认证、分页、中间件、缓存、session等,可以避免浪费大量时间重复造轮子。

安装

pip3 install django   #实例版本是2.0

* 注意,2.0 跟1.x版本上用法上是有些区别的,本课程我们主讲2.x。

安装成功后,就会出现 django-admin 命令

创建Project

你想做个网站,首先我们要创建一个django project, 以后的代码都放在这个项目里。

django-admin  startproject  mysite #项目名是mysite

创建好的项目目录结构

        mysite
        ├── manage.py       # 管理程序的文件,启动和结束等。
        └── my site
            ├── __init__.py
            ├── settings.py     # 程序的配置文件
            ├── urls.py     # 程序的路由系统,即:url和处理其函数的对应的关系
            └── wsgi.py     # 指定框架的wsgi
 
命令帮助我们创建了几个文件,通过文件将功能代码归类。  

创建APP

一个项目中会包含一个或多个子项目,每个项目实现不同的功能和服务,如微信里包含基本通信功能,还有支付、小程序等,每块业务都可以分为一个子项目。在django中, 我们管这个子项目叫app。下面是一个有多app的项目:

为了开发和维护方便,每个子项目(app)都会有一个独立文件夹来存放各自的业务代码。

一般程序简单情况下,只需要创建一个app即可。

python manage.py startapp app01   #app01 是app名称

Django的第一次请求

HTTP请求本质

上面的一次django请求都经历了哪些过程呢?我们来剖析下

浏览器访问网站的本质:socket客户端、socket服务端之间的收发消息。

流程:

1. 【服务端】网站启动,并监听IP和端口,如:127.0.0.1:80,等待客户端来连接…


2. 【客户端】浏览器中输入http://www.oldboyedu.com/index/,浏览器先后进行:

1)连接:域名解析得到网站IP,并根据端口进行连接。

2)发送消息:将请求数据发送给服务端,发送数据本质上是字符串,格式如下:

GET /index/ http1.1\r\nhost:www.oldboyedu.com…..\r\n\r\n
                             
POST /index/ http1.1\r\nhost:www.oldboyedu.com...\r\n\r\nage=18&num=1
3.

3. 【服务端】接收用户请求发来的数据,并根据请求字符串解析,并做出响应。

响应:HTTP/1.1 200 OK\r\nContent-Type: text/html;...\r\n\r\n<html>...</html>

4. 【客户端】接收服务端响应的内容,将响应体展示在浏览器上,响应头偷偷保存到浏览器。

5. 【客户端】【服务端】连接断开,Http请求终止(体现了Http短连接)。

注意:请求和响应基本包含请求头和请求体并通过\r\n\r\n进行分割。

用Django 开发用户登录页面

用户登录是个表单啦,但目前我们只会用Django返回字符串,表单涉及的html元素比较多,总不能在view.py里写好返回吧?这太low了,是的,怎么可以不low? 是时候表演真正的技术啦。

Django有个叫模板(Template)的东东,可以直接把你的Html代码写在模板里,返回给浏览器。

模板初探

想用模板仅需2步,

1. 配置存html文件的模板目录

2. 在你的views.py的响应函数里返回对应的html文件

刚才在开发用户登录页面时,我们的请求处理流程是这样的, 请求-> url.py -> views.py -> template -> 浏览器, 流程为什么这样安排?中间如何要从数据库里拿数据,是应该在哪个阶段?其实Django或其它web语言的web框架在开发时都符合了某种神秘的套路,这个套路是什么?即MVC.

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式

不懂对不对?其实说白了,就是把Web开发中一个请求处理流程分成了3部分,每部分专注做自己的事。

1. Model(模型)一般对应数据库操作、纪录的存取

2. View(视图)决定着如何展示数据

3. Controller(控制器)负现处理用户交互的部分。控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MVC & MTV

Django是一个MTV框架,其架构模板看上去与传统的MVC架构并没有太大的区别。Django将MVC中的视图进一步分解为 Django视图 和 Django模板两个部分,分别决定 “展现哪些数据” 和 “如何展现”,使得Django的模板可以根据需要随时替换,而不仅仅限制于内置的模板。至于MVC控制器部分,由Django框架的URLconf来实现。

再具体点的图