轻量级Django 读书笔记-第一章

第一章 世界上最小的Django项目

参考代码

Django怎么念

Django怎么读了,读法应该是 \/ˈdʒæŋɡoʊ\/ 类似与jang-goh 类似于 姜戈

概念

概念是了解学习一个新事务的基础,是要了解的知识中抽象的,从设计者的角度总结出来的基础构建,同时是学习者入门的钥匙
概念还像是框架,一个范围,有了这些框架和范围,就能对知识的内容和边际有所感知。

  • Web服务器
    Web服务器是处理网络请求的程序,流行的web服务有ApacheNginx等,专注于请求吞吐量、安全,一般能独立处理静态文件
  • Web应用程序
    专门处理复杂的网络请求,返回动态的内容的应用程序,可以理解成Web服务器的扩展,实际上Web服务器主要是利用Web应用程序发挥作用的。Web应用程序可以用多种语言开发,如python,C#,java,php等等
  • WSGI
    WSGI,全称是Web Server Gateway Interface,是Web服务器和Web应用程序的之间的接口,是一个规范,正是有了WSGI,才让Web服务器可以选择不同的Web应用框架或者程序语言来做开发
  • 模型
    模型是数据和附着于数据的一些操作的集合,模型和系统分析中的实体类似,是软件系统的基础,软件系统是围绕在一系列实体之上的
  • 视图
    视图是为了展示数据,是模型的展示
  • URL路由
    用来确定通过URL地址来访问资源(资源的概念来自于RESTful)或者与资源互动

最小的WEB应用

编码

  1. 首先需要一个设置,就像建造房屋的基础,在设置里声明需要用到哪些基础设施,以及公共字段
    • settings是Django项目中用来做设置的类,通过 from django.conf import settrings引用
    • 设置中需要引用项目中的某些资源,比如URL路由设置等,所以需要设置ROOT_URLCONF,由于只用一个文件构建这个项目,所有需要用__name__内部变量作为ROOT_URLCONF的值,表示本代码文件(python中叫模块)

      关于__name__是python中模块(可以理解成代码文件,例如main.py 可以理解成是模块main)在上下文中的名字,如果y由python解释器直接运行,其值为 '__main__',否则(例如被其他模块import)为模块的名字 参考这里

    • DEBUG是调试模式的开关,打开时,如果遇到500错误,会将很详细的错误描述、临时变量、调用栈等信息显示出来,方便调试,并且允许通过localhost域名进行访问。在生产环境中需要设置为关闭,次数就不能通过localhost来访问了,如果需要访问,就需要通过ALLOW_HOSTS来设置可被允许访问的域名,ALLOW_HOSTS是个数组
    • SECRET_KEY很重要,会用来做模块的Hash(例如被加载的静态文件名后面会加上一串编码,编码的安全性直接取决与SECRET_KEY的值

      SECRET_KEY 配置变量是通用密钥, 可在 Flask 和多个第三方扩展中使用. 如其名所示, 加密的强度取决于变量值的机密度. 不同的程序要使用不同的密钥, 而且要保证其他人不知道你所用的字符串.

  2. 创建视图
    • 视图的作用是为不同的请求返回响应的响应,Django 将请求和响应分别封装在 django.http.HttpRequestdjango.http.HttpResponse中了
    • 在视图中定义入口方法,会接收一个参数,这个参数就是HttpRequest的实例,即一次客户端的请求,通过这个参数可以获取到请求中的所有信息,例如Header、cookies等等
    • 在入库方法中可以做任何你想做的事情,例如处理数据、生成报表、合成图片等等,最后需要返回一个HttpResponse对象作为响应,简单例子只返回了字符串'Hello world'
  3. 创建URL路由

    • 路由的作用是处理请求的URL,根据配置将不同URL请求分配给对于的视图
    • 对于Django 2.0+,推荐使用path,代替之前的url,path有更强的表现力,另外不需要用正则表达式作为URL匹配规则,这样减少了一定的配置复杂度
    • 将根URL分配到上面定义的视图上,即 path('', index)
  4. 这三步是最简应用的所有业务代码,这里没有用到 模型,因为最简应用中,数据只是'Hello world',直接写到视图中了

启动

Django是个Web应用框架,要作为Web服务需要启动Web服务器,有两种选择

  1. 作为开发测试用,直接用命令行启动
    • Django自带了一个命令行启动服务的工具,当然不仅可以用来启动服务,还可以用来创建项目等等
    • 只需要引入execute_from_command_line命令行工具就可以了,然后在命令行中输入python hello.py runserver就能启动服务了,hello.py是最简应用的代码文件
  2. 作为生产用,需要借助真正的Web服务器

    • 正如Django官方文档中描述的那样:

      我们在 Web 框架方面是专家,在 Web 服务器方面并不是。

    • 最简单的方式是用Gunicorn做Web服务器,这里会有一个WSGI的概念,和Web服务器链接前,需要提供符合WSGI规范的接口,概念不容易理解,但实现很简单,引入get_wsgi_application,创建一个application对象就可以了

    • 如果不用Web服务器,是否创建WSGI无关紧要,但是要使用的话,必须创建
    • application是约定俗成的名字,自己可以随意修改

提升

编写代码是为了能为更多人服务,即需要将其产品化,所有需要更进一步,为产品化打好基础

  • 动态化
    正如Django的设计精神所说,让开发者不必重复造轮子,代码应该是一次书写,适应多种情况

    有个这样的经历:之前参与了一个项目,每次上线都要花2天时间,因为上线时需要修改十几个文件的配置,不能少改或改错一个,否则上线时间会更长。原因就是开发、测试、生产项目配置没分开,导致上线风险高,且效率极低

    1. 作者推荐用 Twelve Factor App 方法来解决环境配置问题。

      其实很简单,就是根据环境变量加载不同的配置文件或者使配置项变的不同,感慨的是方法论的力量,即使这么简单的方法也有一套理论,因为方法就是一个清单,给清单起个名字交流起来就很方便了,另外可见将这个方法复用起来。对比而已,我总是急于实现,无论什么方法先实现了再说,核心的差别在于总结,不复盘,不思考,像一个饥不择食的人,谈何更高层次的需求。

    2. DEBUGSECRET_KEY 配置成从环境变量中获取,且为他们加入了默认值,这样在开发环境中不用考虑上线需求,可以专注于业务的实现

  • 模板化
    首先说点个人感悟,我们知道时间是最宝贵的财富,也知道时间不能被积累,但世界上有很多中方法可以让时间积累起来,比如复利,比如酿造技术,再比如信用度,还有简单的人品,这些都可以靠时间积累起来,相当于把时间积累起来了。对于技术而言,如何才能让时间积累起来呢?靠经验,靠知识,靠记忆,这些都存在一个问题,就是变现太慢,积累的经验知识要想发挥作用的话是线性的,输入很慢,而且质量无法保证。在我看来最好的积累方式是模板,可以将知识转换成模板,需要用时直接将模板转换为代码,模板是动态的灵活的甚至可继承的,模板是精确的,不会岁时间变得模糊;模板是可维护的,可以将陆陆续续发现的好的点子加进去,这不就实现了时间的积累了吗?

    Django之所以强大,是他的模块化和模板化,以及深入在各个地方的面向对象思想,正是这些特性的存在,让全世界很多优秀的人将自己的智慧时间加入进来,

    这里要说的是他的构建项目的模板,在官方文档中可以通过命令行工具创建一个项目或者App,按作者的话说就是

    通常创建新项目要使用 startproject 命令。这个命令没有什么神奇的地方,只是创建一些文件和目录而已

    言外之意有两点,1 可以不用通过官方的方式来创建项目;2 这个东西我们可以自己做
    对于2扩展一下,可以将一个项目作为我们自己的项目模板,例如做一个博客系统的模板,电商项目的模板,REST项目的模板等等,这将大大提升我们的生产力

    • startproject 命令会从指定模板路径 (默认路径在 {pythonInstallDir}/Lib/site-packages/django/conf/project_template, {pythonInstallDir}是 python安装的目录) 的目录下,拷贝所有的目录及文件
    • 拷贝过程中,startproject 命令会传入一些上下文变量,有project_nameproject_directorysecret_keydocs_version
    • 可以将用这些字段作为文件名、文件夹名,或者写到代码里,在代码中需要用双大括号(暂且叫模板变量替换符吧)来表示 例如 ,将来会被体会为 startproject 命令行参数中的 项目名
    • 项目模板路径,如果创建一个文件夹(project_temps)专门存放这种项目模板,其中有个一个项目模板是 simpleproject ,其下有个project_name.py文件,这时使用命令创建

      1
      $ python django-adming.py startproject myproject --template=project_temps/simpleproject

      就会在当前路径下创建一个文件夹 myproject,其中有个文件是 myproject.py

    • 参数 --template 需要指定确切的路径,支持绝对路径和相对路径
    • 做了个尝试:将项目模板放在默认模板的路径中,在--template中指定项目模板的文件夹名,创建工具并不会去默认的模板路径下查找,相对与他只会在当前目录下找与指定模板同名的目录或者文件

感悟

  正如作者在第一段所描述,当我实践官方的例子时,虽然感到很震撼,但也被项目中多个文件搞晕了,看不出入口和结构,这一章用一个极简的例子,清晰的描述了Django的核心,同时阐述了Web应用的本质。