day21 - Django快速上手

快速上手

Web开发的早期阶段,开发者须要手动编写每一个页面,例如一个新闻门户网站,天天都要修改它的HTML页面,随着网站规模和体量的增大,这种方式就变得极度糟糕。为了解决这个问题,开发人员想到了用外部程序来为Web服务器生成动态内容,也就是说HTML页面以及页面中的动态内容再也不经过手动编写而是经过程序自动生成。最先的时候,这项技术被称为CGI(公共网关接口),固然随着时间的推移,CGI暴露出的问题也愈来愈多,例如大量重复的样板代码,整体性能较为低下等,所以在时代呼唤新英雄的背景下,PHP、ASP、JSP这类Web应用开发技术在上世纪90年代中后期如雨后春笋般涌现。一般咱们说的Web应用是指经过浏览器来访问网络资源的应用程序,由于浏览器的普及性以及易用性,Web应用使用起来方便简单,免除了安装和更新应用程序带来的麻烦,并且也不用关心用户到底用的是什么操做系统,甚至不用区分是PC端仍是移动端。html

Web应用机制和术语

下图向咱们展现了Web应用的工做流程,其中涉及到的术语以下表所示。前端

说明:相信有经验的读者会发现,这张图中其实还少了不少东西,例如反向代理服务器、数据库服务器、防火墙等,并且图中的每一个节点在实际项目部署时多是一组节点组成的集群。固然,若是你对这些没有什么概念也没关系,继续下去就好了,后面会给你们一一讲解的。python

术语 解释
URL/URI 统一资源定位符/统一资源标识符,网络资源的惟一标识
域名 与Web服务器地址对应的一个易于记忆的字符串名字
DNS 域名解析服务,能够将域名转换成对应的IP地址
IP地址 网络上的主机的身份标识,经过IP地址能够区分不一样的主机
HTTP 超文本传输协议,构建在TCP之上的应用级协议,万维网数据通讯的基础
反向代理 代理客户端向服务器发出请求,而后将服务器返回的资源返回给客户端
Web服务器 接受HTTP请求,而后返回HTML文件、纯文本文件、图像等资源给请求者
Nginx 高性能的Web服务器,也能够用做反向代理负载均衡 和 HTTP缓存

HTTP协议

这里咱们稍微费一些笔墨来谈谈上面提到的HTTP。HTTP(超文本传输协议)是构建于TCP(传输控制协议)之上应用级协议,它利用了TCP提供的可靠的传输服务实现了Web应用中的数据交换。按照维基百科上的介绍,设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法,也就是说这个协议是浏览器和Web服务器之间传输的数据的载体。关于这个协议的详细信息以及目前的发展情况,你们能够阅读阮一峰老师的《HTTP 协议入门》《互联网协议入门》系列以及《图解HTTPS协议》进行了解。下图是我于2009年9月10日凌晨4点在四川省网络通讯技术重点实验室用开源协议分析工具Ethereal(抓包工具WireShark的前身)截取的访问百度首页时的HTTP请求和响应的报文(协议数据),因为Ethereal截取的是通过网络适配器的数据,所以能够清晰的看到从物理链路层到应用层的协议数据。git

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

HTTP响应(响应行+响应头+空行+消息体):github

说明:希望这两张如同泛黄的照片般的截图能帮助你了解HTTP究竟是什么样子的。web

Django概述

Python的Web框架有上百个,比它的关键字还要多。所谓Web框架,就是用于开发Web服务器端应用的基础设施(一般指封装好的模块和一系列的工具)。事实上,即使没有Web框架,咱们仍然能够经过socket或CGI来开发Web服务器端应用,可是这样作的成本和代价在实际开发中一般是不能接受的。经过Web框架,咱们能够化繁为简,同时下降建立、更新、扩展应用程序的工做量。Python的Web框架中比较有名的有:Flask、Django、Tornado、Sanic、Pyramid、Bottle、Web2py、web.py等。正则表达式

在基于Python的Web框架中,Django是全部重量级选手中最有表明性的一位,开发者能够基于Django快速的开发可靠的Web应用程序,由于它减小了Web开发中没必要要的开销,对经常使用的设计和开发模式进行了封装,并对MVC架构提供了支持(MTV)。许多成功的网站和App都是基于Django框架构建的,国内比较有表明性的网站包括:知乎、豆瓣网、果壳网、搜狐闪电邮箱、101围棋网、海报时尚网、背书吧、堆糖、手机搜狐网、咕咚、爱福窝、果库等。shell

Django诞生于2003年,它是一个在真正的应用中成长起来的项目,由劳伦斯出版集团旗下在线新闻网站的内容管理系统(CMS)研发团队编写(主要是Adrian Holovaty和Simon Willison),以比利时的吉普赛爵士吉他手Django Reinhardt来命名,在2005年夏天做为开源框架发布。使用Django能用很短的时间构建出功能完备的网站,由于它代替程序员完成了全部乏味和重复的劳动,剩下真正有意义的核心业务给程序员,这一点就是对DRY(Don't Repeat Yourself)理念的最好践行。数据库

快速上手

准备工做

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

    $ python3 --version
    $ python3
    >>> import sys
    >>> sys.version
    >>> sys.version_info
  2. 建立项目文件夹并切换到该目录,例如咱们要实例一个OA(办公自动化)项目。

    $ mkdir oa
    $ cd oa
  3. 建立并激活虚拟环境。

    $ python3 -m venv venv
    $ source venv/bin/activate

    说明:上面使用了Python自带的venv模块完成了虚拟环境的建立,固然也可使用其余的工具,例如:virtualenv或pipenv等。要激活虚拟环境,在Windows系统下是经过"venv/Scripts/activate"`执行批处理文件来实现。

  4. 更新包管理工具pip。

    (venv)$ pip install -U pip

    (venv)$ python -m pip install -U pip

    注意:请注意终端提示符发生的变化,前面的(venv)说明咱们已经进入虚拟环境,而虚拟环境下的python和pip已是Python 3的解释器和包管理工具了。

  5. 安装Django。

    (venv)$ pip install django

    或指定版本号来安装对应的Django的版本。

    (venv)$ pip install django==1.11
  6. 检查Django的版本。

    (venv)$ python -m django --version
    (venv)$ django-admin --version

    (venv)$ python
    >>> import django
    >>> django.get_version()

    固然,也能够经过pip来查看安装的依赖库及其版本,如:

    (venv)$ pip freeze
    (venv)$ pip list

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

    Django版本 Python版本
    1.8 2.七、3.二、3.三、3.四、3.5
    1.九、1.10 2.七、3.四、3.5
    1.11 2.七、3.四、3.五、3.六、3.7
    2.0 3.四、3.五、3.六、3.7
    2.一、2.2 3.五、3.六、3.7
  7. 使用django-admin建立项目,项目命名为oa。

    (venv)$ django-admin startproject oa .

    注意:上面的命令最后的那个点,它表示在当前路径下建立项目。

    执行上面的命令后看看生成的文件和文件夹,它们的做用以下所示:

    • manage.py: 一个让你用各类方式管理 Django 项目的命令行工具。
    • oa/__init__.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
    • oa/settings.py:Django 项目的配置文件。
    • oa/urls.py:Django 项目的 URL 声明,就像你网站的“目录”。
    • oa/wsgi.py:做为你的项目的运行在 WSGI 兼容的Web服务器上的入口。
  8. 启动服务器运行项目。

    (venv)$ python manage.py runserver

    在浏览器中输入http://127.0.0.1:8000访问咱们的服务器,效果以下图所示。

    说明1:刚刚启动的是Django自带的用于开发和测试的服务器,它是一个用纯Python编写的轻量级Web服务器,但它并非真正意义上的生产级别的服务器,千万不要将这个服务器用于和生产环境相关的任何地方。

    说明2:用于开发的服务器在须要的状况下会对每一次的访问请求从新载入一遍Python代码。因此你不须要为了让修改的代码生效而频繁的从新启动服务器。然而,一些动做,好比添加新文件,将不会触发自动从新加载,这时你得本身手动重启服务器。

    说明3:能够经过python manage.py help命令查看可用命令列表;在启动服务器时,也能够经过python manage.py runserver 1.2.3.4:5678来指定绑定的IP地址和端口。

    说明4:能够经过Ctrl+C来终止服务器的运行。

  9. 接下来咱们修改项目的配置文件settings.py,Django是一个支持国际化和本地化的框架,所以刚才咱们看到的默认首页也是支持国际化的,咱们将默认语言修改成中文,时区设置为东八区。

    (venv)$ vim oa/settings.py
    # 此处省略上面的内容 # 设置语言代码 LANGUAGE_CODE = 'zh-hans' # 设置时区 TIME_ZONE = 'Asia/Chongqing' # 此处省略下面的内容
  10. 刷新刚才的页面。

动态页面

  1. 建立名为hrs(人力资源系统)的应用,一个Django项目能够包含一个或多个应用。

    (venv)$ python manage.py startapp hrs

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

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

    (venv)$ vim hrs/views.py
    from django.http import HttpResponse def index(request): return HttpResponse('<h1>Hello, Django!</h1>')
  3. 在应用目录建立一个urls.py文件并映射URL。

    (venv)$ touch hrs/urls.py
    (venv)$ vim hrs/urls.py
    from django.urls import path from hrs import views urlpatterns = [ path('', views.index, name='index'), ]

    说明:上面使用的path函数是Django 2.x中新添加的函数,除此以外还可使用支持正则表达式的URL映射函数re_path函数;Django 1.x中是用名为url函数来设定URL映射。

  4. 切换到项目目录,修改该目录下的urls.py文件,对应用中设定的URL进行合并。

    (venv) $ vim oa/urls.py
    from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('hrs/', include('hrs.urls')), ]
  5. 从新运行项目,并打开浏览器中访问http://localhost:8000/hrs

    (venv)$ python manage.py runserver
  6. 修改views.py生成动态内容。

    (venv)$ vim hrs/views.py
    from io import StringIO from django.http import HttpResponse depts_list = [ {'no': 10, 'name': '财务部', 'location': '北京'}, {'no': 20, 'name': '研发部', 'location': '成都'}, {'no': 30, 'name': '销售部', 'location': '上海'}, ] def index(request): output = StringIO() output.write('<html>\n') output.write('<head>\n') output.write('\t<meta charset="utf-8">\n') output.write('\t<title>首页</title>') output.write('</head>\n') output.write('<body>\n') output.write('\t<h1>部门信息</h1>\n') output.write('\t<hr>\n') output.write('\t<table>\n') output.write('\t\t<tr>\n') output.write('\t\t\t<th width=120>部门编号</th>\n') output.write('\t\t\t<th width=180>部门名称</th>\n') output.write('\t\t\t<th width=180>所在地</th>\n') output.write('\t\t</tr>\n') for dept in depts_list: output.write('\t\t<tr>\n') output.write(f'\t\t\t<td align=center>{dept["no"]}</td>\n') output.write(f'\t\t\t<td align=center>{dept["name"]}</td>\n') output.write(f'\t\t\t<td align=center>{dept["location"]}</td>\n') output.write('\t\t</tr>\n') output.write('\t</table>\n') output.write('</body>\n') output.write('</html>\n') return HttpResponse(output.getvalue())
  7. 刷新页面查看程序的运行结果。

使用视图模板

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

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

Django框架经过shortcuts模块的快捷函数render简化了渲染模板的操做,具体的用法以下所示。

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

    (venv)$ mkdir templates
  2. 建立模板页index.html。

    (venv)$ touch templates/index.html
    (venv)$ vim templates/index.html
    <!DOCTYPE html>
    <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h1>部门信息</h1> <hr> <table> <tr> <th>部门编号</th> <th>部门名称</th> <th>所在地</th> </tr> {% for dept in depts_list %} <tr> <td>{{ dept.no }}</td> <td>{{ dept.name }}</td> <td>{{ dept.location }}</td> <tr> {% endfor %} </table> </body> </html>

    在上面的模板页中咱们使用了{{ greeting }}这样的模板占位符语法,也使用了{% for %}这样的模板指令,这些都是Django模板语言(DTL)的一部分。若是对此不熟悉并没关系,咱们会在后续的内容中进一步的讲解,并且咱们刚才也说到了,还有更好的选择就是使用前端渲染,固然这是后话。

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

    (venv)$ vim hrs/views.py
    from django.shortcuts import render depts_list = [ {'no': 10, 'name': '财务部', 'location': '北京'}, {'no': 20, 'name': '研发部', 'location': '成都'}, {'no': 30, 'name': '销售部', 'location': '上海'}, ] def index(request): return render(request, 'index.html', {'depts_list': depts_list})

    到此为止,咱们尚未办法让views.py中的render函数找到模板文件index.html,为此咱们须要修改settings.py文件,配置模板文件所在的路径。

  4. 切换到项目目录修改settings.py文件。

    (venv)$ vim oa/settings.py
    # 此处省略上面的内容 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] # 此处省略下面的内容
  5. 从新运行项目或直接刷新页面查看结果。

    (venv)$ python manage.py runserver

总结

至此,咱们已经利用Django框架完成了一个很是小的Web应用,虽然它并无任何的实际价值,可是能够经过这个项目对Django框架有一个感性的认识。固然,实际开发中咱们能够用PyCharm来建立项目,若是使用专业版的PyCharm,能够直接建立Django项目。使用PyCharm的好处在于编写代码时能够得到代码提示、错误修复、自动导入等功能,从而提高开发效率,可是专业版的PyCharm须要按年支付相应的费用,社区版的PyCharm中并未包含对Django框架直接的支持,可是咱们仍然可使用它来建立Django项目,只是在使用上没有专业版的方便。关于PyCharm的使用,能够参考《玩转PyCharm》一文。

此外,学习Django最好的资料确定是它的官方文档,除此以外图灵社区出版的《Django基础教程》也是很是适合初学者的读物。

相关文章
相关标签/搜索