您的位置:首页 > 编程语言 > Python开发

廖雪峰Python web开发教程 总结

2018-02-12 01:07 645 查看

道–理解整个web应用

一、web应用的本质

1. 浏览器发送一个HTTP请求;

2. 服务器收到请求,生成一个HTML文档;

3. 服务器把HTML文档作为HTTP响应的Body发送给浏览器;

4. 浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

二、web应用结构的进化

原始文明:WSGI接口。

功能:服务器对端口进行监听,当接收到请求时调用处理函数。这个层次需要构建一个晚辈的处理浏览器请求的函数。

不足:所有请求的处理都从一个函数出发,需要手工分析URL,根据不同的URL,不同的数据生成对应的HTML相应。

农耕文明:使用web框架。(flask为例)

功能:简单的通过函数装饰器便可以定义每个函数处理哪个URL请求。框架会在收到请求之后根据URL调用对应的框架。这个层次,需要针对每个URL写一个处理函数。

不足:URL处理函数仍然需要负责解析参数,生成响应。

工业文明:使用HTML模板。

功能:HTML模板是带有变量的不完整的HTML文档。通过使用支持HTML模板的框架,将HTML模板中的变量替换为相应的值从而快速生成HTML模板。

另外模板还有include方法,即将重复出现的HTML写成单独的文件,其他文件通过include直接导入。

还有模板继承方法,父模板中有通用的结构并留下一些空白的blocks,子模板继承父模板已有的内容并补充完整留空的blocks。

现代文明:独立业务逻辑、中间件。

功能:在flask框架中,一个URL处理函数的输入是request,输出是response。因此这个函数其实做了三件事情,接收请求,业务逻辑处理,生成相应。为了提高开发效率,应该讲业务逻辑处理完全独立,输入输出都应该是和http通信无关的,如此也可以更方便的对业务逻辑函数进行测试。

中间件:是从每个URL处理函数中提取出来的共有内容,中间件可以是日志记录(记录请求信息)、权限验证(验证cookie)。对这些共有的功能提取出来成为中间件,每次接收请求时,请求先经过这些中间件处理,再发给相应的URL函数处理。

由此可见,web框架的发展的作用就是提高web应用的开发效率,使得增加一个新URL处理函数需要的编码工作尽量少。同时也是为了增加代码的可维护性,因为相同功能的代码将不会在不同地方多次出现。

三、HTML、javascript、CSS 三角关系

本质上说,发送给浏览器的就只有HTML。javascript代码和css代码都是可以直接写在HTML文件中的,只不过因为内容太多,一般便选择了写成单独的js、css文件,然后在HTML中引入这些文件。引入的过程,等同于把js、css文件的内容复制到HTML中去,所以返回给浏览器的,其实就只有一个HTML文档。

法–web开发思想

一、MVC框架

按处理请求的过程,一次经过的应该是CMV。

C(Controller):URL处理函数就属于这个部分了。这个部分定义了业务逻辑。无关返回的HTML界面样式,也无关数据的存储。

M(Model):设计了数据的存取方式,提供一套接口供Controller存取数据。ORM方法就是一种Model接口的实现方法。

V(view):定义数据展示方式。HTML模板就属于这个部分。我们可以在仅修改模板的情况下改变返回浏览器的HTML文档的呈现效果。

二、web app API

一般服务器接收请求是因为浏览器地址栏输入了相应的网址,浏览器需要呈现一个网页,这时候返回的是HTML文档。然而还有另外一些时候服务器接收到的请求是从一个HTML文档的javascript代码中发出的,为了是从服务器获取一些信息。这种情况下,服务器回复了一个json对象(也可能是别的)。这个请求的过程可以看做是浏览器调用了服务器的一个API函数。因此这种类型的请求处理函数是web应用API函数。

三、ORM(Object-Relational Mapping)

一般的,关系型数据库的操作都是通过SQL语句进行的。要读取数据库内容就要写select语句,添加内容就写insert语句。要将这些操作转化为方便的接口不容易,ORM就提供了一个好方案。将表对应的表示为代码中的类,表中的每一行数据是该表对应类的一个对象,在类上调用类方法find就可以查找对应数据,在对象上使用save方法就可以将数据保存到数据库。更不可思议的是,定义每张表时只需要继承一个写好的ORM基类,然后定义表的各行就完成了一个表的定义。

术–谈web开发中的一些技术

一、协程

应该是Python中常用的方法,协程是指在运行程序过程中中断去执行别的程序,并在合适的时间返回来继续。因为Python的GIL的存在,多线程并不能真正并行运算,使用协程的方法减少了线程切换的开销,更加高效。

二、登录密码的保存和验证

服务器不会接收也无法保存用户密码的原文。实际上,当用户输入密码之后,在浏览器发送请求之前,网页的js就对密码做了sha1加密处理。这是一种无法逆向还原的加密。服务器存储的是加密后的数据。当用户验证身份时,输入的密码会经过同样的处理,然后返回服务器和服务器存储的加密字符串比较,相同则验证通过。整个过程中,服务器都不知道用户的密码是多少。

三、cookie用于验证用户状态

cookie是用于解决http连接无状态的问题的。当用户登录以后,cookie可以用来表示用户已经登录这个状态。为了防止用户串改自己的状态,这里又要用到sha1加密。服务器在修改了用户状态后,会根据用户的状态信息使用sha1加密为一个字符串,保存在cookie中,每次服务器接收到请求,便用用户的信息重新计算一次sha1加密值,如果相同说明用户没有修改自己的状态信息。那么用户状态便是可信的。

四、套接字(socket)连接

最后说一下“套接字”这个无限迷惑的名词的意思。套接字(socket)是一个tcp 或者udp的连接。当服务器和客户端建立了网络连接时,socket对象就代表了这个连接。所以socket就是网络连接。

五、watchdog自动重启服务器

使用watchdog监控开发目录下文件的变化,自动在项目文件改变时重启服务器。如此可以提高开发效率。

附:还不太懂的知识点

1、MVVM框架
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: