第一章 世界上最小的Django项目
Django怎么念
Django怎么读了,读法应该是 /ˈdʒæŋɡoʊ/ 类似与jang-goh 类似于 姜戈
概念
概念是了解学习一个新事务的基础,是要了解的知识中抽象的,从设计者的角度总结出来的基础构建,同时是学习者入门的钥匙概念还像是框架,一个范围,有了这些框架和范围,就能对知识的内容和边际有所感知。
- Web服务器
Web服务器是处理网络请求的程序,流行的web服务有Apache、Nginx等,专注于请求吞吐量、安全,一般能独立处理静态文件 - Web应用程序
专门处理复杂的网络请求,返回动态的内容的应用程序,可以理解成Web服务器的扩展,实际上Web服务器主要是利用Web应用程序发挥作用的。Web应用程序可以用多种语言开发,如python,C#,java,php等等 - WSGI
WSGI,全称是Web Server Gateway Interface,是Web服务器和Web应用程序的之间的接口,是一个规范,正是有了WSGI,才让Web服务器可以选择不同的Web应用框架或者程序语言来做开发 - 模型模型是数据和附着于数据的一些操作的集合,模型和系统分析中的实体类似,是软件系统的基础,软件系统是围绕在一系列实体之上的
- 视图
视图是为了展示数据,是模型的展示 - URL路由
用来确定通过URL地址来访问资源(资源的概念来自于RESTful)或者与资源互动
最小的WEB应用
编码
-
首先需要一个设置,就像建造房屋的基础,在设置里声明需要用到哪些基础设施,以及公共字段
- 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 和多个第三方扩展中使用. 如其名所示, 加密的强度取决于变量值的机密度. 不同的程序要使用不同的密钥, 而且要保证其他人不知道你所用的字符串.
- settings是Django项目中用来做设置的类,通过
-
创建视图
- 视图的作用是为不同的请求返回响应的响应,Django 将请求和响应分别封装在
django.http.HttpRequest
和django.http.HttpResponse
中了 - 在视图中定义入口方法,会接收一个参数,这个参数就是
HttpRequest
的实例,即一次客户端的请求,通过这个参数可以获取到请求中的所有信息,例如Header、cookies等等 - 在入库方法中可以做任何你想做的事情,例如处理数据、生成报表、合成图片等等,最后需要返回一个
HttpResponse
对象作为响应,简单例子只返回了字符串'Hello world'
- 视图的作用是为不同的请求返回响应的响应,Django 将请求和响应分别封装在
-
创建URL路由
- 路由的作用是处理请求的URL,根据配置将不同URL请求分配给对于的视图
- 对于Django 2.0+,推荐使用path,代替之前的url,path有更强的表现力,另外不需要用正则表达式作为URL匹配规则,这样减少了一定的配置复杂度
- 将根URL分配到上面定义的视图上,即
path('', index)
-
这三步是最简应用的所有业务代码,这里没有用到 模型,因为最简应用中,数据只是
'Hello world'
,直接写到视图中了
启动
Django是个Web应用框架,要作为Web服务需要启动Web服务器,有两种选择
- 作为开发测试用,直接用命令行启动
- Django自带了一个命令行启动服务的工具,当然不仅可以用来启动服务,还可以用来创建项目等等
- 只需要引入
execute_from_command_line
命令行工具就可以了,然后在命令行中输入python hello.py runserver
就能启动服务了,hello.py
是最简应用的代码文件
- 作为生产用,需要借助真正的Web服务器
-
正如Django官方文档中描述的那样:
我们在 Web 框架方面是专家,在 Web 服务器方面并不是。
-
最简单的方式是用Gunicorn做Web服务器,这里会有一个WSGI的概念,和Web服务器链接前,需要提供符合WSGI规范的接口,概念不容易理解,但实现很简单,引入
get_wsgi_application
,创建一个application
对象就可以了 -
如果不用Web服务器,是否创建WSGI无关紧要,但是要使用的话,必须创建
-
application
是约定俗成的名字,自己可以随意修改
-
提升
编写代码是为了能为更多人服务,即需要将其产品化,所有需要更进一步,为产品化打好基础
-
动态化
正如Django的设计精神所说,让开发者不必重复造轮子,代码应该是一次书写,适应多种情况有个这样的经历:之前参与了一个项目,每次上线都要花2天时间,因为上线时需要修改十几个文件的配置,不能少改或改错一个,否则上线时间会更长。原因就是开发、测试、生产项目配置没分开,导致上线风险高,且效率极低
-
作者推荐用 Twelve Factor App 方法来解决环境配置问题。
其实很简单,就是根据环境变量加载不同的配置文件或者使配置项变的不同,感慨的是方法论的力量,即使这么简单的方法也有一套理论,因为方法就是一个清单,给清单起个名字交流起来就很方便了,另外可见将这个方法复用起来。对比而已,我总是急于实现,无论什么方法先实现了再说,核心的差别在于总结,不复盘,不思考,像一个饥不择食的人,谈何更高层次的需求。
-
将
DEBUG
和SECRET_KEY
配置成从环境变量中获取,且为他们加入了默认值,这样在开发环境中不用考虑上线需求,可以专注于业务的实现
-
-
模板化
首先说点个人感悟,我们知道时间是最宝贵的财富,也知道时间不能被积累,但世界上有很多中方法可以让时间积累起来,比如复利,比如酿造技术,再比如信用度,还有简单的人品,这些都可以靠时间积累起来,相当于把时间积累起来了。对于技术而言,如何才能让时间积累起来呢?靠经验,靠知识,靠记忆,这些都存在一个问题,就是变现太慢,积累的经验知识要想发挥作用的话是线性的,输入很慢,而且质量无法保证。在我看来最好的积累方式是模板,可以将知识转换成模板,需要用时直接将模板转换为代码,模板是动态的灵活的甚至可继承的,模板是精确的,不会岁时间变得模糊;模板是可维护的,可以将陆陆续续发现的好的点子加进去,这不就实现了时间的积累了吗?Django之所以强大,是他的模块化和模板化,以及深入在各个地方的面向对象思想,正是这些特性的存在,让全世界很多优秀的人将自己的智慧时间加入进来,
这里要说的是他的构建项目的模板,在官方文档中可以通过命令行工具创建一个项目或者App,按作者的话说就是
通常创建新项目要使用
startproject
命令。这个命令没有什么神奇的地方,只是创建一些文件和目录而已言外之意有两点,1 可以不用通过官方的方式来创建项目;2 这个东西我们可以自己做
对于2扩展一下,可以将一个项目作为我们自己的项目模板,例如做一个博客系统的模板,电商项目的模板,REST项目的模板等等,这将大大提升我们的生产力startproject
命令会从指定模板路径 (默认路径在{pythonInstallDir}/Lib/site-packages/django/conf/project_template
,{pythonInstallDir}
是 python安装的目录) 的目录下,拷贝所有的目录及文件- 拷贝过程中,
startproject
命令会传入一些上下文变量,有project_name
、project_directory
、secret_key
、docs_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应用的本质。