web框架分析
web框架简介
- web框架需要快速入门
Web框架是一组工具的集合, 为你的Web应用开发提供了基础环境, 从如何获取参数,到如何返回结果, 从如何获取cookie到如何修改返回的http header。Web框架帮你隐藏了HTTP协议的细节, 你作为一个使用者只需要关心如何实现功能,而不需要底层到底实现的是什么。 - Web框架很多, 不同的语言都有自己实现的不同的Web框架. 每一种都有各自不同的实现思路, 有不同的开发哲学, 不管是就换工作换开发栈的需要, 还是学习本身的需要, 快速的多掌握几个框架还是很有必要的.
- web框架的工作方式
- 现代的Web框架,不管其采用何种设计思想, 开发哲学, 根本的工作模式是相似的,均是从接收HTTP请求,处理HTTP的各项参数,路由到相应的用户实现的处理器上, 再获取返回的结果, 生成HTTP的Response。
- 流程图:
![](https://pic1.zhimg.com/80/v2-988e45bb7c2676d2cd6d00ab620743cd_hd.jpg)
- web框架的工作流程
- URL路由
一般来说现在大部分的Web框架对于将HTTP请求交给哪一个逻辑来处理, 是由URL路由框架的模块来决定的. URL路由模块会提供一些函数或者装饰器等方式, 让用户来写一些代码, 将URL和控制器的绑定关系注册到框架中. 大多数的框架都支持在URL路由的定义中使用正则表达式.有的支持在URL中定义参数,框架会自动在URL中将参数截取出来保存在框架的上下文中以供控制器使用. - 控制器
控制器是用户自己实现的类或者函数, 用来处理HTTP请求, 确切的说是指定URL发来的请求, 并且将业务逻辑的结果返回给框架,有框架去决定如何解析成HTTP的响应数据输出.框架需要给控制器提供HTTP请求的完整上下文环境,那么我们在学习框架使用的时候, 首先就要在文档中整理清楚下面的这些问题: - 如何获取Query String参数?
QueryString是url中?后定义的由&符号分割的key=value形式的参数, 框架会在解析HTTP协议的时候将这个部分的数据转化成比如字典之类的数据结构存起来, 然后提供相应的API去访问.但是QueryString都是只读的, 有一些框架会提供一些工具帮助用户组装URL, 比如Flask提供了url_for用来组装转跳到指定控制器的URL, 方便你在页面上渲染相应的标签 - 如何获取Form表单的数据? json?boby ?
POST和PUT方法是HTTP协议中主要的接收数据的语义, 传输数据需要相应的编码方式将数据编码后放在HTTP协议的Body部分. 编码方式现在主要有两种, 一种是最古老的用Form表单编制数据的方式, 另外一种是将数据用json字符串直接放到HTTP协议的body部分. 网页上的应用多数会采用Form表单, 因为这是浏览器对Form表单的默认支持, 而App的后端大多采用JSONString放在body来传数据的方式, 优点是可以传送复杂的数据结构.Web框架会提供相应的API去按照这两种方式获取Body的内容, 但是有的框架会根据header里的content-type来判断是不是可以按照JSON去解析body的内容. - 如何读取和修改cookie?
cookie是浏览器(客户端)在多次请求之间共享数据的一个数据结构, 因为HTTP协议是无状态的,所以cookie在每一次请求的时候都会从浏览器放到HTTP请求中传到服务端, 在服务端生成响应的时候也会写入HTTP响应里传回浏览器. 从而实现了在两次请求之间共享了数据. Web框架会提供对应的API去读取和修改cookie的值, cookie是key-value形式的, 访问的方式应该和字典类似. - 如何获取 headers ?
headers对应到HTTP协议中HTTP请求的头部, 是一个key-value形式的数据格式.headers是HTTP请求的一些额外的描述信息, 比如客户端类型, 字符编码方式, 认证信息等. headers的key是固定的, 你不能自己随便定义一些特殊key, 并且headers部分也是只读的.框架会提供对应API去读取headers. - 如何实现页面转跳 ?
有些时候在处理完数据后需要通知浏览器转跳到对应的看数据的URL上去, 就需要在文档里找找如何实现页面转跳. 服务端返回给客户端一个HTTP协议中的301或者302的状态, 就可以让浏览器去执行转跳的动作, 作出这样子的HTTP响应在框架中会有对应的API. - 如何输出Http响应 ?
大多数的Web框架都是用函数(方法)的返回值来作为Http响应的body的, 所以你在很多示例中可以看到 return 'fu qiang' 这样子的写法, 框架会自动把字符串转换成Response的对象再去做编码成Http响应的操作. 针对App的API会比较方便, 输出JSON的字符串就行了. 如果是网站的话, 需要输出HTML页面,有一些框架提供了内置的模板引擎, 用于渲染输出html内容(其实不限html, xml的内容也可以由模板引擎来渲染). 有的框架自己不提供模板引擎, 你可以用你喜欢的模板引擎来渲染. - 流程图如下:
![](https://pic3.zhimg.com/80/v2-b768b4a5522f05f9e40ecd68d773c29a_hd.jpg)
- web框架所需的开发环境
Web框架的开发环境由其实现的语言来决定, 比如说Python的pycharm 和 vscode 等 IDE 集成环境。 - web框架一些常用的配置文件
配置Web框架的一些参数,这需要直接看配置文件或者自定义配置文件 - web框架所需要的模版引擎
前面在控制器的部分提到了模板引擎, 模板引擎主要负责用数据替换模板上的占位符生成最终结果的文本. 工作方式可以简化为下图:
![](https://pic1.zhimg.com/80/v2-19d86d82e75c671b59fb311311a6c18a_hd.jpg)
这里详细的说一下模板引擎部分在学习的时候要注意那一些要点:
占位符如何定义
如何定义循环
如何定义判断条件
如何对占位符加过滤器
如何定义继承模板
如何定义嵌套模板
- web框架的中间件或者钩子函数
中间件是AOP模式统一在每个请求的开始和结束部分注入代码的机制, 最常见的有两个级别的中间件, 一个是Application级别的, 也就是在应用启动和结束的时候执行注入的代码, 另一个是Request级别的, 主要是在每个请求开始和结束的时候执行, 比如统一的鉴权,数据库连接管理(打开,关闭), 统一的错误处理 都可以在这里完成.
![](https://pic1.zhimg.com/80/v2-28500a86ce14c9b511d307e4dafa3443_hd.jpg)
- 统一的错误处理
框架是提供了统一错误处理机制的, 当在控制器中发生了没有捕获或者重新抛出的异常的时候, 就会执行到统一错误处理的部分。 - 鉴权
通过cookie或者auth2.0和中间件可以很轻松的实现鉴权和Session机制。 - 生产部署的方式
尽可能的做压力测试, 以至于让你的项目能够正式的上线, 需要了解如何部署生产环境。