什么是Web框架?
可不要被名字迷惑,它可不是web⽹页的框架,⽽是服务器⽤来产⽣web⽹页时⽤到的⼯具。
Web应⽤框架(简称Web框架),是⽤来构建web⽀持下的应⽤程序的实践⽅式。从简单的博客到复杂的富Ajax应⽤,web上的每个页⾯都是通过代码构建起来的。最近我发现很多对web框架(如Flask、Django)感兴趣的开发者没有真正地理解什么是web框架——它们的⽬的是什么、它们怎么运⾏。因此,我将在本⽂中讨论web框架这个经常被忽略的基础话题。通读本⽂,你会对什么web框架、为什么它们⼀开始就存在等问题有深⼊的理解,这也会让你学习⼀个新的web框架以及使⽤哪个框架时的决定⼤为轻松。
Web如何⼯作
在我们讨论具体的框架以前,需要理解web如何⼯作,为此我们将深⼊探讨当你在浏览器中输⼊URL地址并按下回车键时到你的浏览器在呈现页⾯的过程中经过的步骤(不包括DNS查表)。
Web服务器及web提供的服务
每个页⾯都以HTML⽂件发送到你的浏览器中,HTML是⼀种浏览器⽤来描述内容和页⾯结构的⼀种语⾔,把HTML发送到你的浏览器中的应⽤程序就是Web服务器。同时,这个应⽤程序所在的机器也叫做
Web服务器。
HTTP
浏览器使⽤HTTP协议(协议,在编程领域中是通信双⽅约定的数据格式和通信步骤)从Web服务器(或叫应⽤程序服务器)中下载页
⾯,HTTP协议基于请求—响应模型,客户端(你的浏览器)向在运⾏在⼀台物理机器上的⽹页应⽤程序请求数据,web应⽤程序接着就⽤你浏览器请求的数据来响应这个请求。
有⼀点需要记住的是,通信总是由客户端(你的浏览器)发起的,服务器(这⾥是web服务器)没有任何⽅式发起连接或者主动给你的浏览器发送未请求的信息,如果你从⼀个⽹页服务器中收到了数据,那⼀定是因为你的浏览器发出了请求。
update是什么HTTP⽅法
在HTTP协议中的每⼀个信息都有相关的⽅法(或动作),各不相同的HTTP⽅法对应于客户端根据不同的需要⽽发出的不同逻辑的请求,⽐如请求⼀个⽹页的HTML就和提交⼀个表单在逻辑上不⼀样,所以处理这两种的请求就需要不同的⽅法。
H TTP GET
GET⽅法做的事就跟它说的⼀样:从⽹页服务器要求(请求)数据,GET请求是⽬前最常见的HTTP请求,在⼀个GET请求过程中,⽹页应⽤程序除了将所需要页⾯的HTML响应给这个请求外不做任何其他事情。这⾥特意指出,在处理GET请求过程中⽹页应⽤程序不应改变⾃⾝任何状态(⽐如,它不能基于⼀个GET请求就创建⼀个新的⽤户帐户),因为这个原因,GET请求通常被认为是“安全”的,因为它们不会导致驱动⽹站的应⽤程序的任何变化。
H TTP POST
显然,除了单纯地看看页⾯意外还有更多与⽹站交互的⽅式,我们也可以向web应⽤程序发送数据,⽐如说⼀个表单,要完成这个⼯作,需要另⼀个不同的请求:POST。POST请求通常会携带⽤户输⼊的数据,继⽽会引起web应⽤采取⼀些⾏为。在⽹站的表单上输⼊你的信息来注册就是通过POST请求把表单上的数据传递给web应⽤的。
与GET请求不同,POST请求通常会导致web应⽤的状态改变,在上⾯的例⼦中,当⼀个表单被POST以后,就创建了⼀个新的⽤户帐户,其次,POST请求也不总是会让⼀个新的HTML页⾯发送给客户端,客户端通过响应的响应码来决定服务器上的操作是否进⾏顺利。
H TTP 响应码
web服务器的fatigue
如果我们接着上述的例⼦继续讲解web应⽤,随之⽽来有很多问题需要解决:
1. 我们要怎么检测所需要的URL并且返回合适的⽹页?
2. 除了简单的GET请求以外,我们如何处理POST请求?
3. 怎么处理⼀些像sessions和cookies等更⾼级的概念?
4. 如何描述能够处理数以千计并发连接的应⽤?
如你能想象,没有⼈愿意每次构建服务器时都要逐⼀对付这些问题,因此就有了能够处理HTTP协议细节和统⼀解决上述问题的包。然⽽要记住,它们的核⼼就跟我们上述提到的例⼦⼀样:监听请求并且发送带有HTML的HTTP响应。
注意客户端 web 框架(如前端当前流⾏的三⼤框架:React、Vue以及Angular)是另⼀个不同的庞然⼤物,与我们上述讲到的⼤不相同。
解决两个主要问题:路由与模版
在构建⼀个web应⽤涉及到的⼀切问题中,有两个是重中之重:
1. 如何将⼀个被请求的URL定位到⽤于处理它的代码?
2. 如何动态创建被请求的HTML,在其中加⼊从数据库读取的计算值或信息?
每个web框架都⽤某些⽅式来解决这些问题,并且有很多不同的⽅法。接下来我讨论了Django和Flask⽤来解决这些问题的⽅式,⾸先我们要简要讨论MVC架构。
Django中的MVC
Django遵从MVC架构并且要求使⽤该框架的代码也使⽤该架构,MVC即“模型—视图—控制 (Model-View-Controller)”的缩写,⽤来表⽰web应⽤需要负责的不同⽅⾯。与数据库有关的资源是⽤模型来表⽰(类似的,Python中常⽤class来表⽰⼀些真实世界中的对象),控制包含应⽤的业务逻辑和对模型的操作,视图接受所有⽤来动态⽣成HTML页⾯所需要的信息。
令初学者疑惑的是,在Django中,MVC架构中的控制叫做视图,视图叫做模版,除去命名上的古怪,Django是⾮常典型的MVC架构的部署⽅式。
Django中的路由
路由是将被请求的URL定位到负责⽣成相关HTML的代码的过程,最简单的例⼦是所有请求都⽤同⼀个代码进⾏处理(如我们之前所举的例⼦),稍微复杂⼀点,每⼀个URL按照1:1地对应到视图函数中,⽐如,我们可以在某个代码来实现如下功能,如果请求URL www.foo/bar,就
让handle_bar()函数来负责处理进⾏响应,以此类推,我们可以为所有web应⽤⽀持的URLs建⽴对应的处理函数。
但是,如果URLs中包含了有⽤的数据,⽐如某个资源的ID(按上⾯的例⼦来说,如果URL是www.foo/users/3/),这种路由⽅法就会失败,那么我们怎么样将URL对应到⼀个视图函数的同时呈现ID为3的⽤户页⾯呢?
Django的处理⽅式是⽤URL正则表达式定位到能够接受参数的视图函数,举例来说,我可以说符合^/users/(?P<id>\d+)/$格式的URLs会调
⽤display_user(id)函数,函数中的id变量会⽤正则表达式中的id进⾏替换,通过这种处理,任何/users/<some number>/格式的URL会定位
到display_user函数中,这些正则表达式可以写得⾮常复杂,并且同时包含键盘和位置参数。
Flask中的路由
Flask则⽤了不太⼀样的处理⽅式,它通过使⽤route()修饰器将⼀个被请求的URL和函数连接起来。下⾯的Flask代码跟上⾯提到的正则表达式与函数的功能相同:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论