diff --git "a/Day36-40/NoSQL\345\205\245\351\227\250.md" "b/Day36-40/NoSQL\345\205\245\351\227\250.md" index c3c6ebd6af072650fb3b39eaa744229f2ec09b24..f0298cd132c5bea3607928387421ecf4c021bac3 100644 --- "a/Day36-40/NoSQL\345\205\245\351\227\250.md" +++ "b/Day36-40/NoSQL\345\205\245\351\227\250.md" @@ -4,10 +4,6 @@ -### 主流NoSQL数据库 - - - ### Redis概述 1. Redis的安装和启动 diff --git "a/Day41-55/01.\345\277\253\351\200\237\344\270\212\346\211\213.md" "b/Day41-55/01.\345\277\253\351\200\237\344\270\212\346\211\213.md" index 291902cd1ac659b57605a95c0236a36b8fd5e4fe..8890beb03d3ea287b7ec0d11b6eb1b4f0e82e164 100644 --- "a/Day41-55/01.\345\277\253\351\200\237\344\270\212\346\211\213.md" +++ "b/Day41-55/01.\345\277\253\351\200\237\344\270\212\346\211\213.md" @@ -1,6 +1,6 @@ -## Django 2实战-01:快速上手 +## Django实战(01) - 快速上手 -Web开发的早期阶段,开发者需要手动编写每个页面,例如一个新闻门户网站,每天都要修改它的HTML页面,这样随着网站规模和体量的增大,这种方式就变得极度糟糕。为了解决这个问题,开发人员想到了用外部程序来为Web服务器生成动态内容,也就是说HTML页面以及页面中的动态内容不再通过手动编写而是通过程序自动生成。最早的时候,这项技术被称为CGI(公共网关接口),当然随着时间的推移,CGI暴露出的问题也越来越多,例如大量重复的样板代码,总体性能较为低下等,因此在时代呼唤新英雄的背景下,PHP、ASP、JSP这类Web应用开发技术在上世纪90年代中后期如雨后春笋般涌现。通常我们说的Web应用是指通过浏览器来访问网络资源的应用程序,因为浏览器的普及性以及易用性,Web应用使用起来方便简单,免除了安装和更新应用程序带来的麻烦,而且也不用关心用户到底用的是什么操作系统,甚至不用区分是PC端还是移动端。 +Web开发的早期阶段,开发者需要手动编写每个页面,例如一个新闻门户网站,每天都要修改它的HTML页面,随着网站规模和体量的增大,这种方式就变得极度糟糕。为了解决这个问题,开发人员想到了用外部程序来为Web服务器生成动态内容,也就是说HTML页面以及页面中的动态内容不再通过手动编写而是通过程序自动生成。最早的时候,这项技术被称为CGI(公共网关接口),当然随着时间的推移,CGI暴露出的问题也越来越多,例如大量重复的样板代码,总体性能较为低下等,因此在时代呼唤新英雄的背景下,PHP、ASP、JSP这类Web应用开发技术在上世纪90年代中后期如雨后春笋般涌现。通常我们说的Web应用是指通过浏览器来访问网络资源的应用程序,因为浏览器的普及性以及易用性,Web应用使用起来方便简单,免除了安装和更新应用程序带来的麻烦,而且也不用关心用户到底用的是什么操作系统,甚至不用区分是PC端还是移动端。 ### Web应用机制和术语 @@ -8,7 +8,7 @@ Web开发的早期阶段,开发者需要手动编写每个页面,例如一 ![](./res/web-application.png) -> 说明:相信有经验的读者会发现,这张图中其实还少了很多东西,例如反向代理服务器、数据库服务器、防火墙等,而且图中的每个节点在实际项目部署时可能是一组节点组成的集群。当然,如果你对这些没有什么概念也不要紧,后续的课程中我们会为大家进行讲解。 +> 说明:相信有经验的读者会发现,这张图中其实还少了很多东西,例如反向代理服务器、数据库服务器、防火墙等,而且图中的每个节点在实际项目部署时可能是一组节点组成的集群。当然,如果你对这些没有什么概念也不要紧,继续下去就行了,后面会给大家一一讲解的。 | 术语 | 解释 | | ------------- | ------------------------------------------------------------ | @@ -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)进行了解。下图是我于2009年9月10日凌晨4点在四川省网络通信技术重点实验室用开源协议分析工具Ethereal(抓包工具WireShark的前身)截取的访问百度首页时的HTTP请求和响应的报文(协议数据),由于Ethereal截取的是经过网络适配器的数据,因此可以清晰的看到从物理链路层到应用层的协议数据。 HTTP请求(请求行+请求头+空行+[消息体]): @@ -33,11 +33,11 @@ HTTP响应(响应行+响应头+空行+消息体): ![](./res/http-response.png) -> 说明:但愿这两张如同泛黄的照片般的截图帮助你大概的了解到HTTP是一个怎样的协议。 +> 说明:但愿这两张如同泛黄的照片般的截图能帮助你了解HTTP到底是什么样子的。 ### Django概述 -Python的Web框架有上百个,比它的关键字还要多。所谓Web框架,就是用于开发Web服务器端应用的基础设施(通常指封装好的模块和一系列的工具)。事实上,即便没有Web框架,我们仍然可以通过socket或[CGI](https://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E7%BD%91%E5%85%B3%E6%8E%A5%E5%8F%A3)来开发Web服务器端应用,但是这样做的成本和代价在实际开发中通常是不能接受的。通过Web框架,我们可以化繁为简,同时降低创建、更新、扩展应用程序的工作量。Python的Web框架中比较有名的有:Flask、Django、Tornado、Pyramid、Bottle、Web2py、web.py等。 +Python的Web框架有上百个,比它的关键字还要多。所谓Web框架,就是用于开发Web服务器端应用的基础设施(通常指封装好的模块和一系列的工具)。事实上,即便没有Web框架,我们仍然可以通过socket或[CGI](https://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E7%BD%91%E5%85%B3%E6%8E%A5%E5%8F%A3)来开发Web服务器端应用,但是这样做的成本和代价在实际开发中通常是不能接受的。通过Web框架,我们可以化繁为简,同时降低创建、更新、扩展应用程序的工作量。Python的Web框架中比较有名的有:Flask、Django、Tornado、Sanic、Pyramid、Bottle、Web2py、web.py等。 在基于Python的Web框架中,Django是所有重量级选手中最有代表性的一位,开发者可以基于Django快速的开发可靠的Web应用程序,因为它减少了Web开发中不必要的开销,对常用的设计和开发模式进行了封装,并对MVC架构提供了支持(MTV)。许多成功的网站和App都是基于Django框架构建的,国内比较有代表性的网站包括:知乎、豆瓣网、果壳网、搜狐闪电邮箱、101围棋网、海报时尚网、背书吧、堆糖、手机搜狐网、咕咚、爱福窝、果库等。 @@ -49,7 +49,7 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 #### 准备工作 -1. 检查Python环境:Django 1.11需要Python 2.7或Python 3.4以上的版本;Django 2.0需要Python 3.4以上的版本。 +1. 检查Python环境:Django 1.11需要Python 2.7或Python 3.4以上的版本;Django 2.0需要Python 3.4以上的版本;Django 2.1需要Python 3.5以上的版本。 ```Shell $ python3 --version @@ -75,12 +75,18 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 $ python3 -m venv venv $ source venv/bin/activate ``` - > 注意:Windows系统下是执行`venv/Scripts/activate.bat`批处理文件。 + > 说明:上面使用了Python自带的venv模块完成了虚拟环境的创建,当然也可以使用其他的工具,例如:virtualenv或pipenv等。要激活虚拟环境,在Windows系统下是通过"venv/Scripts/activate"`执行批处理文件来实现。 4. 更新包管理工具pip。 ```Shell - (venv)$ python -m pip install --upgrade pip + (venv)$ pip install -U pip + ``` + + 或 + + ```Shell + (venv)$ python -m pip install -U pip ``` > 注意:请注意终端提示符发生的变化,前面的`(venv)`说明我们已经进入虚拟环境,而虚拟环境下的python和pip已经是Python 3的解释器和包管理工具了。 @@ -103,21 +109,29 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 (venv)$ django-admin --version ``` + 或 + ```Shell (venv)$ python >>> import django >>> django.get_version() ``` - 下图展示了Django版本和Python版本的对应关系,在我们的项目中我们选择了最新的Django 2.0的版本。 + 当然,也可以通过pip来查看安装的依赖库及其版本,如: + + ```Shell + (venv)$ pip freeze + (venv)$ pip list + ``` + + 下图展示了Django版本和Python版本的对应关系,如果在安装时没有指定版本号,将自动选择最新的版本(在写作这段内容时,最新的版本是2.0;目前最新的版本已经更新到2.2)。 | Django版本 | Python版本 | | ---------- | ----------------------- | | 1.8 | 2.7、3.2、3.3、3.4、3.5 | | 1.9、1.10 | 2.7、3.4、3.5 | - | 1.11 | 2.7、3.4、3.5、3.6 | - | 2.0 | 3.4、3.5、3.6 | - - > 说明:在写这篇文章时Django 2.1版本尚未正式发布,因此我们的教程使用了2.0.5版本。 + | 1.11 | 2.7、3.4、3.5、3.6、3.7 | + | 2.0 | 3.4、3.5、3.6、3.7 | + | 2.1、2.2 | 3.5、3.6、3.7 | 7. 使用`django-admin`创建项目,项目命名为oa。 @@ -150,15 +164,14 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 > 说明2:用于开发的服务器在需要的情况下会对每一次的访问请求重新载入一遍Python代码。所以你不需要为了让修改的代码生效而频繁的重新启动服务器。然而,一些动作,比如添加新文件,将不会触发自动重新加载,这时你得自己手动重启服务器。 - > 说明3:可以通过`python manage.py help`命令查看可用命令列表;在启动服务器时,也可以通过`python manage.py runserver 1.2.3.4:56789`来指定绑定的IP地址和端口。 + > 说明3:可以通过`python manage.py help`命令查看可用命令列表;在启动服务器时,也可以通过`python manage.py runserver 1.2.3.4:5678`来指定绑定的IP地址和端口。 > 说明4:可以通过Ctrl+C来终止服务器的运行。 -9. 接下来我们进入项目目录oa并修改配置文件settings.py,Django是一个支持国际化和本地化的框架,因此刚才我们看到的默认首页也是支持国际化的,我们将默认语言修改为中文,时区设置为东八区。 +9. 接下来我们修改项目的配置文件settings.py,Django是一个支持国际化和本地化的框架,因此刚才我们看到的默认首页也是支持国际化的,我们将默认语言修改为中文,时区设置为东八区。 ```Shell - (venv)$ cd oa - (venv)$ vim settings.py + (venv)$ vim oa/settings.py ``` ```Python @@ -172,18 +185,13 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 # 此处省略下面的内容 ``` -10. 回到manage.py所在的目录,刷新刚才的页面。 - - ```Shell - (venv)$ cd .. - (venv)$ python manage.py runserver - ``` +10. 刷新刚才的页面。 ![](./res/django-index-2.png) #### 动态页面 -1. 创建名为hrs(人力资源系统)的应用(注:一个项目可以包含多个应用)。 +1. 创建名为hrs(人力资源系统)的应用,一个Django项目可以包含一个或多个应用。 ```Shell (venv)$ python manage.py startapp hrs @@ -192,7 +200,7 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 执行上面的命令会在当前路径下创建hrs目录,其目录结构如下所示: - `__init__.py`:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。 - - `admin.py`:可以用来注册模型,让Django自动创建管理界面。 + - `admin.py`:可以用来注册模型,用于在Django的管理界面管理模型。 - `apps.py`:当前应用的配置。 - `migrations`:存放与模型有关的数据库迁移信息。 - `__init__.py`:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。 @@ -200,11 +208,10 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 - `tests.py`:包含测试应用各项功能的测试类和测试函数。 - `views.py`:处理请求并返回响应的函数(MVC中的C,MVT中的V)。 -2. 进入应用目录修改视图文件views.py。 +2. 修改应用目录下的视图文件views.py。 ```Shell - (venv)$ cd hrs - (venv)$ vim views.py + (venv)$ vim hrs/views.py ``` ```Python @@ -218,8 +225,8 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 3. 在应用目录创建一个urls.py文件并映射URL。 ```Shell - (venv)$ touch urls.py - (venv)$ vim urls.py + (venv)$ touch hrs/urls.py + (venv)$ vim hrs/urls.py ``` ```Python @@ -231,14 +238,12 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 path('', views.index, name='index'), ] ``` - > 说明:上面使用的path函数是Django 2.x中新添加的函数,除此之外还有re_path是支持正则表达式的URL映射函数;Django 1.x中是用url函数来设定URL映射。 + > 说明:上面使用的`path`函数是Django 2.x中新添加的函数,除此之外还可以使用支持正则表达式的URL映射函数`re_path`函数;Django 1.x中是用名为`url`函数来设定URL映射。 4. 切换到项目目录,修改该目录下的urls.py文件,对应用中设定的URL进行合并。 ```Shell - (venv) $ cd .. - (venv) $ cd oa - (venv) $ vim urls.py + (venv) $ vim oa/urls.py ``` ```Python @@ -251,22 +256,16 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 ] ``` -5. 启动项目并访问应用。 +5. 重新运行项目,并打开浏览器中访问。 ```Shell - (venv)$ cd .. (venv)$ python manage.py runserver ``` - 在浏览器中访问。 - - > 说明:如果想实现远程访问,需要先确认防火墙是否已经打开了8000端口,而且需要在配置文件settings.py中修改ALLOWED_HOSTS的设置,添加一个'*'表示允许所有的客户端访问Web应用。 - 6. 修改views.py生成动态内容。 ```Shell - (venv)$ cd hrs - (venv)$ vim views.py + (venv)$ vim hrs/views.py ``` ```Python @@ -309,33 +308,29 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 return HttpResponse(output.getvalue()) ``` -7. 再次使用下面的命令来启动服务器并查看程序的运行结果。 +7. 刷新页面查看程序的运行结果。 - ```Shell - (venv)$ cd .. - (venv)$ python manage.py runserver - ``` ![](./res/runserver01.png) #### 使用视图模板 -上面通过拼接HTML代码的方式生成动态视图的做法在实际开发中是无能接受的,这一点我相信是不言而喻的。为了解决这个问题,我们可以提前准备一个模板页,所谓模板页就是一个带占位符的HTML页面,当我们将程序中获得的数据替换掉页面中的占位符时,一个动态页面就产生了。 +上面通过拼接HTML代码的方式生成动态视图的做法在实际开发中是无能接受的,这一点大家一定能够想到。为了解决这个问题,我们可以提前准备一个模板页,所谓模板页就是一个带占位符的HTML页面,当我们将程序中获得的数据替换掉页面中的占位符时,一个动态页面就产生了。 + +我们可以用Django框架中template模块的Template类创建模板对象,通过模板对象的render方法实现对模板的渲染。所谓的渲染就是用数据替换掉模板页中的占位符,当然这里的渲染称为后端渲染,即在服务器端完成页面的渲染再输出到浏览器中,这种做法的主要坏处是当并发访问量较大时,服务器会承受较大的负担,所以今天有很多的Web应用都使用了前端渲染,即服务器只为浏览器提供所需的数据(通常是JSON格式),在浏览器中通过JavaScript获取这些数据并渲染到页面上,这些内容在后面为大家呈现。 -我们可以用Django框架中template模块的Template类创建模板对象,通过模板对象的render方法实现对模板的渲染。所谓的渲染就是用数据替换掉模板页中的占位符,Django框架通过shortcuts模块的快捷函数render简化了渲染模板的操作,具体的用法如下所示。 +Django框架通过shortcuts模块的快捷函数`render`简化了渲染模板的操作,具体的用法如下所示。 -1. 先回到manage.py文件所在的目录创建一个templates文件夹。 +1. 先回到manage.py文件所在的目录创建名为templates文件夹。 ```Shell - (venv)$ cd .. (venv)$ mkdir templates - (venv)$ cd templates ``` 2. 创建模板页index.html。 ```Shell - (venv)$ touch index.html - (venv)$ vim index.html + (venv)$ touch templates/index.html + (venv)$ vim templates/index.html ``` ```HTML @@ -364,14 +359,12 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 ``` - 注意在模板页中我们使用了`{{ greeting }}`这样的模板占位符语法,也使用了`{% for %}`这样的模板指令,如果对此不熟悉并不要紧,我们会在后续的内容中进一步的讲解模板的用法。 + 在上面的模板页中我们使用了`{{ greeting }}`这样的模板占位符语法,也使用了`{% for %}`这样的模板指令,这些都是Django模板语言(DTL)的一部分。如果对此不熟悉并不要紧,我们会在后续的内容中进一步的讲解,而且我们刚才也说到了,还有更好的选择就是使用前端渲染,当然这是后话。 3. 回到应用目录,修改views.py文件。 ```Shell - (venv)$ cd .. - (venv)$ cd hrs - (venv)$ vim views.py + (venv)$ vim hrs/views.py ``` ```Python @@ -388,14 +381,12 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 return render(request, 'index.html', {'depts_list': depts_list}) ``` - 到此为止,我们还没有办法让views.py中的render函数找到模板文件index.html,为此我们需要修改settings.py文件,配置模板文件所在的路径。 + 到此为止,我们还没有办法让views.py中的`render`函数找到模板文件index.html,为此我们需要修改settings.py文件,配置模板文件所在的路径。 4. 切换到项目目录修改settings.py文件。 ```Shell - (venv)$ cd .. - (venv)$ cd oa - (venv)$ vim settings.py + (venv)$ vim oa/settings.py ``` ```Python @@ -420,16 +411,15 @@ Django诞生于2003年,它是一个在真正的应用中成长起来的项目 # 此处省略下面的内容 ``` -5. 重新运行项目并查看结果。 +5. 重新运行项目或直接刷新页面查看结果。 ```Shell - (venv)$ cd .. (venv)$ python manage.py runserver ``` ### 总结 -至此,我们已经利用Django框架完成了一个非常小的Web应用,虽然它并没有任何的实际价值,但是我们需要通过这个项目了解到Django框架的使用方式。当然,如果使用PyCharm的Professional版本,也可以通过PyCharm的创建项目的选项直接创建Django项目,使用PyCharm的好处在于编写代码时可以获得代码提示、错误修复、自动导入等功能,从而提升开发效率,但是代价是需要支付对应的费用才能使用专业版的PyCharm,社区版的PyCharm中并未包含对Web框架的支持。 +至此,我们已经利用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)也是非常适合初学者的读物。 \ No newline at end of file +此外,学习Django最好的资料肯定是它的[官方文档](https://docs.djangoproject.com/zh-hans/2.0/),除此之外图灵社区出版的[《Django基础教程》](http://www.ituring.com.cn/book/2630)也是非常适合初学者的读物。 \ No newline at end of file diff --git "a/Day41-55/02.\346\267\261\345\205\245\346\250\241\345\236\213.md" "b/Day41-55/02.\346\267\261\345\205\245\346\250\241\345\236\213.md" index 424ac0b0a024fc8e87337225c0f645e5a23fe77b..ffa940e27c6fba6a992f338823c31f45dcf50821 100644 --- "a/Day41-55/02.\346\267\261\345\205\245\346\250\241\345\236\213.md" +++ "b/Day41-55/02.\346\267\261\345\205\245\346\250\241\345\236\213.md" @@ -1,16 +1,15 @@ -## Django 2实战-02:深入模型 +## Django实战(02) - 深入模型 -在上一个章节中,我们提到了Django是基于MVC架构的Web框架,MVC架构追求的是“模型”和“视图的解耦合。所谓“模型”说得更直白一些就是数据,所以通常也被称作“数据模型”。在实际的项目中,数据模型通常通过数据库实现持久化操作,而关系型数据库在很长一段时间都是持久化的首选方案,下面我们以MySQL为例来说明如何使用关系型数据库来实现持久化操作。 +在上一个章节中,我们提到了Django是基于MVC架构的Web框架,MVC架构追求的是“模型”和“视图”的解耦合。所谓“模型”说得更直白一些就是数据,所以通常也被称作“数据模型”。在实际的项目中,数据模型通常通过数据库实现持久化操作,而关系型数据库在很长一段时间都是持久化的首选方案,下面我们以MySQL为例来说明如何使用关系型数据库来实现持久化操作。 ### 配置关系型数据库MySQL 我们继续来完善上一个章节中的OA项目,首先从配置项目使用的数据库开始。 -1. 进入oa文件夹,修改项目的settings.py文件,首先将我们之前创建的应用hrs添加已安装的项目中,然后配置MySQL作为持久化方案。 +1. 修改项目的settings.py文件,首先将我们之前创建的应用hrs添加已安装的项目中,然后配置MySQL作为持久化方案。 ```Shell - (venv)$ cd oa - (venv)$ vim settings.py + (venv)$ cd oa/settings.py ``` ```Python @@ -97,8 +96,7 @@ 4. 可以看到,Django帮助我们创建了10张表,这些都是使用Django框架需要的东西,稍后我们就会用到这些表。除此之外,我们还应该为我们自己的应用创建数据模型。如果要在hrs应用中实现对部门和员工的管理,我们可以创建如下所示的数据模型。 ```Shell - (venv)$ cd hrs - (venv)$ vim models.py + (venv)$ vim hrs/models.py ``` ```Python @@ -137,7 +135,6 @@ 5. 通过模型创建数据表。 ```Shell - (venv)$ cd .. (venv)$ python manage.py makemigrations hrs Migrations for 'hrs': hrs/migrations/0001_initial.py @@ -186,8 +183,7 @@ 3. 注册模型类。 ```Shell - (venv)$ cd hrs - (venv)$ vim admin.py + (venv)$ vim hrs/admin.py ``` ```Python @@ -293,7 +289,6 @@ 在了解了Django提供的模型管理平台之后,我们来看看如何从代码层面完成对模型的CRUD(Create / Read / Update / Delete)操作。我们可以通过manage.py开启Shell交互式环境,然后使用Django内置的ORM框架对模型进行CRUD操作。 ```Shell -(venv)$ cd .. (venv)$ python manage.py shell Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin @@ -353,6 +348,9 @@ Type "help", "copyright", "credits" or "license" for more information. >>> >>> Dept.objects.get(no__exact=30) +>>> +>>> Dept.objects.filter(no=10).first() + ``` 排序数据。 diff --git "a/Day41-55/03.\351\235\231\346\200\201\350\265\204\346\272\220\345\222\214Ajax\350\257\267\346\261\202.md" "b/Day41-55/03.\351\235\231\346\200\201\350\265\204\346\272\220\345\222\214Ajax\350\257\267\346\261\202.md" index dc001ade306866e9bae5cb33a7fc52b4def0b2c5..0af222c2c4a214989576743f8c7d2bbb4097a681 100644 --- "a/Day41-55/03.\351\235\231\346\200\201\350\265\204\346\272\220\345\222\214Ajax\350\257\267\346\261\202.md" +++ "b/Day41-55/03.\351\235\231\346\200\201\350\265\204\346\272\220\345\222\214Ajax\350\257\267\346\261\202.md" @@ -1,4 +1,4 @@ -## Django 2实战-03:静态资源和Ajax请求 +## Django实战(03) - 静态资源和Ajax请求 基于前面两个章节讲解的知识,我们已经可以使用Django框架来实现Web应用的开发了。接下来我们就尝试实现一个投票应用,具体的需求是用户进入系统首先来到“登录页”;登录成功后可以查看到“学科介绍”页面,该页面显示了一个学校所开设的所有学科;通过点击某个学科,可以进入“讲师详情”页面,该页面展示了该学科所有讲师的详细情况,可以在该页面上给讲师点击“好评”或“差评”;对于未注册的用户,可以在登录页点击“新用户注册”进入“注册页”完成用户注册,注册成功或失败都会获得相应的提示信息,注册成功后会返回“登录页”。 diff --git "a/Day41-55/04.\350\241\250\345\215\225\347\232\204\345\272\224\347\224\250.md" "b/Day41-55/04.\350\241\250\345\215\225\347\232\204\345\272\224\347\224\250.md" index 2d9c4e5da8389c7b8d57ff86e0c48b2d8557f255..d145592ac50311560da406c77e53b5029964af30 100644 --- "a/Day41-55/04.\350\241\250\345\215\225\347\232\204\345\272\224\347\224\250.md" +++ "b/Day41-55/04.\350\241\250\345\215\225\347\232\204\345\272\224\347\224\250.md" @@ -1,4 +1,4 @@ -## Django 2实战-04:表单的应用 +## Django实战(04) - 表单的应用 我们继续来完成上一章节中的项目,实现“用户注册”和“用户登录”的功能。Django框架中提供了对表单的封装,而且提供了多种不同的使用方式。 diff --git a/README.md b/README.md index f1731e48cb68566691af83126627d30fee18f1a0..d2833fa4cca4adac04695f04c4455849db90be41 100644 --- a/README.md +++ b/README.md @@ -164,18 +164,18 @@ #### Day15 - [图像和文档处理](./Day01-15/Day15/图像和办公文档处理.md) -- 用Pillow处理图片 -- 读写Word文档 -- 读写Excel文件 -- 生成PDF文件 +- 用Pillow处理图片 - 图片读写 / 图片合成 / 几何变换 / 色彩转换 / 滤镜效果 +- 读写Word文档 - 文本内容的处理 / 段落 / 页眉和页脚 / 样式的处理 +- 读写Excel文件 - xlrd模块 / xlwt模块 +- 生成PDF文件 - pypdf2模块 / reportlab模块 ### Day16~Day20 - [Python语言进阶 ](./Day16-20/Python语言进阶.md) - 常用数据结构 -- 函数的高级用法 -- 面向对象高级知识 -- 迭代器和生成器 -- 并发和异步编程 +- 函数的高级用法 - “一等公民” / 高阶函数 / Lambda函数 / 作用域和闭包 / 装饰器 +- 面向对象高级知识 - “三大支柱” / 类与类之间的关系 / 垃圾回收 / 魔术属性和方法 / 混入 / 元类 / 面向对象设计原则 / GoF设计模式 +- 迭代器和生成器 - 相关魔术方法 / 创建生成器的两种方式 / +- 并发和异步编程 - 多线程 / 多进程 / 异步IO / async和await ### Day21~30 - [Web前端入门](./Day21-30/Web前端概述.md) @@ -185,6 +185,7 @@ - jQuery入门和提高 - Vue.js入门 - Element的使用 +- Bootstrap的使用 ### Day31~35 - [玩转Linux操作系统](./Day31-35/玩转Linux操作系统.md) @@ -204,15 +205,16 @@ - 关系型数据库概述 - MySQL的安装和使用 - SQL的使用 - - DDL - - DML - - DQL - - DCL + - DDL - 数据定义语言 - create / drop / alter + - DML - 数据操作语言 - insert / delete / update / select + - DCL - 数据控制语言 - grant / revoke + - 相关知识 + - 范式理论 - 设计二维表的指导思想 + - 数据完整性 + - 数据一致性 - 在Python中操作MySQL - - MySQL高级知识 - [NoSQL入门](./Day36-40/NoSQL入门.md) - NoSQL概述 - - 主流NoSQL数据库 - Redis概述 - Mongo概述 @@ -220,10 +222,24 @@ #### Day41 - [快速上手](./Day41-55/01.快速上手.md) +- Web应用工作原理和HTTP协议 +- Django框架概述 +- 5分钟快速上手 +- 使用视图模板 + #### Day42 - [深入模型](./Day41-55/02.深入模型.md) +- 关系型数据库配置 +- 管理后台的使用 +- 使用ORM完成对模型的CRUD操作 +- Django模型最佳实践 +- 模型定义参考 + #### Day43 - [静态资源和Ajax请求](./Day41-55/03.静态资源和Ajax请求.md) +- 加载静态资源 +- 用Ajax请求获取数据 + #### Day44 - [表单的应用](./Day41-55/04.表单的应用.md) #### Day45 - [Cookie和会话](./Day41-55/05.Cookie和会话.md) diff --git a/res/pycharm-comm-django-1.png b/res/pycharm-comm-django-1.png new file mode 100644 index 0000000000000000000000000000000000000000..615c74e5010090463d3996607c04762945f12a55 Binary files /dev/null and b/res/pycharm-comm-django-1.png differ diff --git a/res/pycharm-comm-django-2.png b/res/pycharm-comm-django-2.png new file mode 100644 index 0000000000000000000000000000000000000000..94049bb64b0b06772cd1094889fa1e81e6db0a5b Binary files /dev/null and b/res/pycharm-comm-django-2.png differ diff --git a/res/pycharm-comm-django-3.png b/res/pycharm-comm-django-3.png new file mode 100644 index 0000000000000000000000000000000000000000..292283c08de620ac6675c2fe99cd4d98f11ccd1f Binary files /dev/null and b/res/pycharm-comm-django-3.png differ diff --git a/res/pycharm-comm-django-4.png b/res/pycharm-comm-django-4.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb75bfe25da703b56d74e54a84ddc7b18626491 Binary files /dev/null and b/res/pycharm-comm-django-4.png differ diff --git a/res/pycharm-comm-django-5.png b/res/pycharm-comm-django-5.png new file mode 100644 index 0000000000000000000000000000000000000000..81c5f6f33eb29e9d5fc2817f01c95fa18b54132a Binary files /dev/null and b/res/pycharm-comm-django-5.png differ diff --git a/res/pycharm-comm-django-6.png b/res/pycharm-comm-django-6.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a71f126b871e651b4f3246d395d4cbe4b9d4a6 Binary files /dev/null and b/res/pycharm-comm-django-6.png differ diff --git a/res/pycharm-comm-django-7.png b/res/pycharm-comm-django-7.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0f6646e1f371a6bf78e6582ae8e70a4c4adc4f Binary files /dev/null and b/res/pycharm-comm-django-7.png differ diff --git a/res/pycharm-comm-django-8.png b/res/pycharm-comm-django-8.png new file mode 100644 index 0000000000000000000000000000000000000000..83c5ad7955f4ebd0a6fefeac9a0160070812368e Binary files /dev/null and b/res/pycharm-comm-django-8.png differ diff --git a/res/pycharm-prof-django-2.png b/res/pycharm-prof-django-2.png new file mode 100644 index 0000000000000000000000000000000000000000..091ac45a505d8ba7d922aad6e233b81de6083df8 Binary files /dev/null and b/res/pycharm-prof-django-2.png differ diff --git a/res/pycharm-prof-django-3.png b/res/pycharm-prof-django-3.png new file mode 100644 index 0000000000000000000000000000000000000000..537a43d1c4367ae3b8bbbc4d2d0fea20895f15d0 Binary files /dev/null and b/res/pycharm-prof-django-3.png differ diff --git "a/\347\216\251\350\275\254PyCharm.md" "b/\347\216\251\350\275\254PyCharm.md" index b4ddcbd1f5537a5f9b87444599157a99e0ab3d05..b40f819c3c0613e68f68a6d1b45c7e14a4e58c40 100644 --- "a/\347\216\251\350\275\254PyCharm.md" +++ "b/\347\216\251\350\275\254PyCharm.md" @@ -46,4 +46,48 @@ PyCharm是由JetBrains公司开发的提供给Python专业的开发者的一个 ![](./res/pycharm-workspace.png) -在工作窗口的右键菜单中可以找到“Run ...”和“Debug ...”菜单项,通过这两个菜单项我们就可以运行和调试我们的代码啦。建议关注一下菜单栏中的“Code”、“Refactor”和“Tools”菜单,这里面为编写Python代码提供了很多有用的帮助,我们在后面也会陆续为大家介绍这些功能。 \ No newline at end of file +在工作窗口的右键菜单中可以找到“Run ...”和“Debug ...”菜单项,通过这两个菜单项我们就可以运行和调试我们的代码啦。建议关注一下菜单栏中的“Code”、“Refactor”和“Tools”菜单,这里面为编写Python代码提供了很多有用的帮助。 + +### 创建Django项目 + +#### 专业版 + +PyCharm专业版提供了对Django、Flask、Google App Engine、web2py等Python Web框架以及SQL、UML、前端语言和框架、远程调试、虚拟化部署等功能的支持,如果使用PyCharm专业版,在创建项目时可以直接选择创建Django项目并设置模板语言以及放置模板页的文件夹。 + +![](./res/pycharm-prof-django-3.png) + +创建好项目之后,打开终端输入`pip list`命令,可以看到项目所需的依赖项已经安装好了,而且可以直接点击屏幕右上方的运行或调试按钮来直接运行Django项目。 + +![](./res/pycharm-prof-django-2.png) + +#### 社区版 + +PyCharm社区版只能创建Python项目,如果项目中需要Django的支持,可以自行安装依赖库并创建Django项目。 + +![](./res/pycharm-comm-django-1.png) + +创建好Python项目之后,可以打开屏幕下方的终端(Terminal),并通过`pip install`安装Django项目的依赖项。 + +![](./res/pycharm-comm-django-2.png) + +当然也可以在项目的设置菜单中找到解释器配置,并选择要添加的依赖项。 + +![](./res/pycharm-comm-django-7.png) + +![](./res/pycharm-comm-django-8.png) + +接下来可以在终端中输入`django-amdin startproject`指令来创建项目。 + +![](./res/pycharm-comm-django-3.png) + +如果要运行项目,可以在终端中输入`python manage.py runserver`启动测试服务器。当然,也可以点击屏幕右上方的“Add Configuration”按钮,进入如下所示的配置界面,并点击窗口左上角的“+”来添加一个运行配置。 + +![](./res/pycharm-comm-django-4.png) + +在配置窗口的右侧,指定要执行的脚本路径(Django项目的manage.py文件的位置)和运行参数(runserver)。 + +![](./res/pycharm-comm-django-5.png) + +注意到窗口的右上角了吗?现在可以点击运行或调试按钮来启动测试服务器运行项目了。 + +![](./res/pycharm-comm-django-6.png) \ No newline at end of file