Skip to content

Commit

Permalink
更新了Linux、数据库和Django部分的文档
Browse files Browse the repository at this point in the history
  • Loading branch information
jackfrued committed Jun 16, 2019
1 parent 87de54a commit 0640abb
Show file tree
Hide file tree
Showing 10 changed files with 582 additions and 338 deletions.
428 changes: 214 additions & 214 deletions Day31-35/31.玩转Linux操作系统.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Day36-40/39.NoSQL入门.md
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,7 @@ python3

```Python
>>> from pymongo import MongoClient
>>> client = MongoClient('mongodb://120.77.222.217:27017')
>>> client = MongoClient('mongodb://127.0.0.1:27017')
>>> db = client.school
>>> for student in db.students.find():
... print('学号:', student['stuid'])
Expand Down
51 changes: 28 additions & 23 deletions Day41-55/41.快速上手.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Web开发的早期阶段,开发者需要手动编写每个页面,例如一

#### HTTP协议

这里我们稍微费一些笔墨来谈谈上面提到的HTTP。HTTP(超文本传输协议)是构建于TCP(传输控制协议)之上应用级协议,它利用了TCP提供的可靠的传输服务实现了Web应用中的数据交换。按照维基百科上的介绍,设计HTTP最初的目的是为了提供一种发布和接收[HTML](https://zh.wikipedia.org/wiki/HTML)页面的方法,也就是说这个协议是浏览器和Web服务器之间传输的数据的载体。关于这个协议的详细信息以及目前的发展状况,大家可以阅读阮一峰老师的[《HTTP 协议入门》](http://www.ruanyifeng.com/blog/2016/08/http.html)、[《互联网协议入门》](http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html)系列以及[《图解HTTPS协议》](http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html)进行了解。下图是我于2009年9月10日凌晨4点在四川省网络通信技术重点实验室用开源协议分析工具Ethereal(抓包工具WireShark的前身)截取的访问百度首页时的HTTP请求和响应的报文(协议数据),由于Ethereal截取的是经过网络适配器的数据,因此可以清晰的看到从物理链路层到应用层的协议数据。
这里我们稍微费一些笔墨来谈谈上面提到的HTTP。HTTP(超文本传输协议)是构建于TCP(传输控制协议)之上应用级协议,它利用了TCP提供的可靠的传输服务实现了Web应用中的数据交换。按照维基百科上的介绍,设计HTTP最初的目的是为了提供一种发布和接收[HTML](https://zh.wikipedia.org/wiki/HTML)页面的方法,也就是说这个协议是浏览器和Web服务器之间传输的数据的载体。关于这个协议的详细信息以及目前的发展状况,大家可以阅读阮一峰老师的[《HTTP 协议入门》](http://www.ruanyifeng.com/blog/2016/08/http.html)、[《互联网协议入门》](http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html)系列以及[《图解HTTPS协议》](http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html)进行了解。下图是我在四川省网络通信技术重点实验室学习和工作期间使用开源协议分析工具Ethereal(抓包工具WireShark的前身)截取的访问百度首页时的HTTP请求和响应的报文(协议数据),由于Ethereal截取的是经过网络适配器的数据,因此可以清晰的看到从物理链路层到应用层的协议数据。

HTTP请求(请求行+请求头+空行+[消息体]):

Expand All @@ -33,7 +33,7 @@ HTTP响应(响应行+响应头+空行+消息体):

![](./res/http-response.png)

> 说明:但愿这两张如同泛黄的照片般的截图能帮助你了解HTTP到底是什么样子的。
> 说明:这两张图是在2009年9月10日截取的,但愿这两张如同泛黄的照片般的截图能帮助你了解HTTP到底是什么样子的。
### Django概述

Expand All @@ -51,6 +51,8 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目

1. 检查Python环境:Django 1.11需要Python 2.7或Python 3.4以上的版本;Django 2.0需要Python 3.4以上的版本;Django 2.1需要Python 3.5以上的版本。

> 说明:我自己平时使用macOS做开发,macOS和Linux平台使用的命令跟Windows平台有较大的区别,这一点在之前也有过类似的说明,如果使用Windows平台做开发,替换一下对应的命令即可。
```Shell
$ python3 --version
```
Expand All @@ -75,7 +77,7 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目
$ python3 -m venv venv
$ source venv/bin/activate
```
> 说明:上面使用了Python自带的venv模块完成了虚拟环境的创建,当然也可以使用其他的工具,例如:virtualenv或pipenv等。要激活虚拟环境,在Windows系统下是通过"venv/Scripts/activate"`执行批处理文件来实现。
> 说明:上面使用了Python自带的venv模块完成了虚拟环境的创建,当然也可以使用virtualenv或pipenv这样的工具。要激活虚拟环境,在Windows环境下可以通过"venv/Scripts/activate"执行批处理文件来实现。
4. 更新包管理工具pip。

Expand All @@ -99,7 +101,7 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目
或指定版本号来安装对应的Django的版本。

```Shell
(venv)$ pip install django==1.11
(venv)$ pip install django==2.1.8
```

6. 检查Django的版本。
Expand All @@ -123,7 +125,7 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目
(venv)$ pip list
```

下图展示了Django版本和Python版本的对应关系,如果在安装时没有指定版本号,将自动选择最新的版本(在写作这段内容时,最新的版本是2.0;目前最新的版本已经更新到2.2)。
下图展示了Django版本和Python版本的对应关系,如果在安装时没有指定版本号,将自动选择最新的版本(在写作这段内容时,Django最新的版本是2.2)。

| Django版本 | Python版本 |
| ---------- | ----------------------- |
Expand All @@ -143,11 +145,13 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目
执行上面的命令后看看生成的文件和文件夹,它们的作用如下所示:

- `manage.py`: 一个让你用各种方式管理 Django 项目的命令行工具。
- `oa/__init__.py`:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
- `oa/settings.py`:Django 项目的配置文件。
- `oa/urls.py`:Django 项目的 URL 声明,就像你网站的“目录”。
- `oa/wsgi.py`:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。
- `manage.py`: 一个让你可以管理Django项目的工具程序。
- `oa/__init__.py`:一个空文件,告诉Python解释器这个目录应该被视为一个Python的包。
- `oa/settings.py`:Django项目的配置文件。
- `oa/urls.py`:Django项目的URL声明(URL映射),就像是你的网站的“目录”。
- `oa/wsgi.py`:项目运行在WSGI兼容Web服务器上的接口文件。

> 说明:WSGI全称是Web服务器网关接口,维基百科上给出的解释是“为Python语言定义的[Web服务器](https://zh.wikipedia.org/wiki/%E7%B6%B2%E9%A0%81%E4%BC%BA%E6%9C%8D%E5%99%A8)[Web应用程序](https://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F)或框架之间的一种简单而通用的接口”。
8. 启动服务器运行项目。

Expand All @@ -164,7 +168,7 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目
> 说明2:用于开发的服务器在需要的情况下会对每一次的访问请求重新载入一遍Python代码。所以你不需要为了让修改的代码生效而频繁的重新启动服务器。然而,一些动作,比如添加新文件,将不会触发自动重新加载,这时你得自己手动重启服务器。
> 说明3:可以通过`python manage.py help`命令查看可用命令列表;在启动服务器时,也可以通过`python manage.py runserver 1.2.3.4:5678`来指定绑定的IP地址和端口
> 说明3:可以通过`python manage.py help`命令查看可用命令列表;在启动服务器时,也可以通过`python manage.py runserver 1.2.3.4:5678`来指定将服务器运行于哪个IP地址和端口
> 说明4:可以通过Ctrl+C来终止服务器的运行。
Expand Down Expand Up @@ -199,14 +203,14 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目

执行上面的命令会在当前路径下创建hrs目录,其目录结构如下所示:

- `__init__.py`:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包
- `__init__.py`:一个空文件,告诉Python解释器这个目录应该被视为一个Python的包
- `admin.py`:可以用来注册模型,用于在Django的管理界面管理模型。
- `apps.py`当前应用的配置
- `apps.py`当前应用的配置文件
- `migrations`:存放与模型有关的数据库迁移信息。
- `__init__.py`:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包
- `models.py`:存放应用的数据模型,即实体类及其之间的关系(MVC/MVT中的M)。
- `__init__.py`:一个空文件,告诉Python解释器这个目录应该被视为一个Python的包
- `models.py`:存放应用的数据模型,即实体类及其之间的关系(MVC/MTV中的M)。
- `tests.py`:包含测试应用各项功能的测试类和测试函数。
- `views.py`:处理请求并返回响应的函数(MVC中的C,MVT中的V)。
- `views.py`:处理请求并返回响应的函数(MVC中的C,MTV中的V)。

2. 修改应用目录下的视图文件views.py。

Expand Down Expand Up @@ -240,7 +244,7 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目
```
> 说明:上面使用的`path`函数是Django 2.x中新添加的函数,除此之外还可以使用支持正则表达式的URL映射函数`re_path`函数;Django 1.x中是用名为`url`函数来设定URL映射。
4. 切换到项目目录,修改该目录下的urls.py文件,对应用中设定的URL进行合并。
4. 修改项目目录下的urls.py文件,对应用中设定的URL进行合并。

```Shell
(venv) $ vim oa/urls.py
Expand All @@ -256,6 +260,8 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目
]
```

> 说明:上面的代码通过`include`函数将hrs应用中配置URL的文件包含到项目的URL配置中,并映射到`hrs/`路径下。
5. 重新运行项目,并打开浏览器中访问<http://localhost:8000/hrs>

```Shell
Expand Down Expand Up @@ -316,9 +322,7 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目

上面通过拼接HTML代码的方式生成动态视图的做法在实际开发中是无能接受的,这一点大家一定能够想到。为了解决这个问题,我们可以提前准备一个模板页,所谓模板页就是一个带占位符的HTML页面,当我们将程序中获得的数据替换掉页面中的占位符时,一个动态页面就产生了。

我们可以用Django框架中template模块的Template类创建模板对象,通过模板对象的render方法实现对模板的渲染。所谓的渲染就是用数据替换掉模板页中的占位符,当然这里的渲染称为后端渲染,即在服务器端完成页面的渲染再输出到浏览器中,这种做法的主要坏处是当并发访问量较大时,服务器会承受较大的负担,所以今天有很多的Web应用都使用了前端渲染,即服务器只为浏览器提供所需的数据(通常是JSON格式),在浏览器中通过JavaScript获取这些数据并渲染到页面上,这些内容在后面为大家呈现。

Django框架通过shortcuts模块的快捷函数`render`简化了渲染模板的操作,具体的用法如下所示。
我们可以用Django框架中template模块的Template类创建模板对象,通过模板对象的render方法实现对模板的渲染,在Django框架中还有一个名为`render`的便捷函数可以来完成渲染模板的操作。所谓的渲染就是用数据替换掉模板页中的占位符,当然这里的渲染称为后端渲染,即在服务器端完成页面的渲染再输出到浏览器中,这种做法的主要坏处是当并发访问量较大时,服务器会承受较大的负担,所以今天有很多的Web应用都使用了前端渲染,即服务器只提供所需的数据(通常是JSON格式),在浏览器中通过JavaScript获取这些数据并渲染到页面上,这个我们在后面的内容中会讲到。

1. 先回到manage.py文件所在的目录创建名为templates文件夹。

Expand Down Expand Up @@ -359,7 +363,7 @@ Django框架通过shortcuts模块的快捷函数`render`简化了渲染模板的
</body>
</html>
```
在上面的模板页中我们使用了`{{ greeting }}`这样的模板占位符语法,也使用了`{% for %}`这样的模板指令,这些都是Django模板语言(DTL)的一部分。如果对此不熟悉并不要紧,我们会在后续的内容中进一步的讲解,而且我们刚才也说到了,还有更好的选择就是使用前端渲染,当然这是后话。
在上面的模板页中我们使用了`{{ greeting }}`这样的模板占位符语法,也使用了`{% for %}`这样的模板指令,这些都是Django模板语言(DTL)的一部分。如果对此不熟悉并不要紧,我们会在后续的内容中进一步的讲解,而且我们刚才也说到了,渲染页面还有更好的选择就是使用前端渲染,当然这是后话。

3. 回到应用目录,修改views.py文件。

Expand All @@ -381,6 +385,8 @@ Django框架通过shortcuts模块的快捷函数`render`简化了渲染模板的
return render(request, 'index.html', {'depts_list': depts_list})
```

> 说明:Django框架通过shortcuts模块的便捷函数`render`简化了渲染模板的操作,有了这个函数,就不用先创建`Template`对象再去调用`render`方法。。
到此为止,我们还没有办法让views.py中的`render`函数找到模板文件index.html,为此我们需要修改settings.py文件,配置模板文件所在的路径。

4. 切换到项目目录修改settings.py文件。
Expand Down Expand Up @@ -420,6 +426,5 @@ Django框架通过shortcuts模块的快捷函数`render`简化了渲染模板的

### 总结

至此,我们已经利用Django框架完成了一个非常小的Web应用,虽然它并没有任何的实际价值,但是可以通过这个项目对Django框架有一个感性的认识。当然,实际开发中我们可以用PyCharm来创建项目,如果使用专业版的PyCharm,可以直接创建Django项目。使用PyCharm的好处在于编写代码时可以获得代码提示、错误修复、自动导入等功能,从而提升开发效率,但是专业版的PyCharm需要按年支付相应的费用,社区版的PyCharm中并未包含对Django框架直接的支持,但是我们仍然可以使用它来创建Django项目,只是在使用上没有专业版的方便。关于PyCharm的使用,可以参考[《玩转PyCharm》](../玩转PyCharm.md)一文。
至此,我们已经利用Django框架完成了一个非常小的Web应用,虽然它并没有任何的实际价值,但是可以通过这个项目对Django框架有一个感性的认识。当然,实际开发中我们可以用PyCharm来创建项目,如果使用专业版的PyCharm,可以直接创建Django项目。使用PyCharm的好处在于编写代码时可以获得代码提示、错误修复、自动导入等功能,从而提升开发效率,但是专业版的PyCharm需要按年支付相应的费用,社区版的PyCharm中并未包含对Django框架直接的支持,但是我们仍然可以使用它来创建Django项目,只是在使用上没有专业版的方便。关于PyCharm的使用,可以参考[《玩转PyCharm》](../玩转PyCharm.md)一文。此外,Django最好的学习资料肯定是它的[官方文档](https://docs.djangoproject.com/zh-hans/2.0/),当然图灵社区出版的[《Django基础教程》](http://www.ituring.com.cn/book/2630)也是非常适合初学者的入门级读物。

此外,学习Django最好的资料肯定是它的[官方文档](https://docs.djangoproject.com/zh-hans/2.0/),除此之外图灵社区出版的[《Django基础教程》](http://www.ituring.com.cn/book/2630)也是非常适合初学者的读物。
Loading

0 comments on commit 0640abb

Please sign in to comment.