作为一个使用Python的Web工程师,你必须从全局了解浏览器是如何与服务器互联的
2台计算机之间是可以互联的,也就是说,A计算机可以发送消息给B计算机,B计算机收到A计算机发出的请求之后会回复消息给A计算机。在这个通信的基础之上就建立起了一些规则,比如我们常常提到的BS结构,B是指浏览器,S是指服务器。我们常见的baidu搜索服务就是使用了BS结构构建的。BS结构规定了通信的一端必须是浏览器,而另外一端可以是任何计算机程序。为了让2台计算机通信,人们发明了通信协议,比如TCP/IP、HTTP等等。这些协议约定了2台计算机通信的具体格式和内容,非常类似人类发明的语言。使用BS结构来构建服务的时候,浏览器与服务器之间的通信大量地依赖于HTTP协议。具备了浏览器、HTTP协议、服务器程序这三部分之后,我们就可以构建互联网服务,并且提供给全世界使用!接下来,我们一起探究每一部分的作用,以及它们之间的关系。
1.HTTP 协议
Internet是一个大规模分布式的信息系统,如下图所示
要想使用HTTP协议,那么就需要在浏览器端和服务器端实现一套程序来解析HTTP协议。工程师一般不会直接实现这些模块,因为浏览器和服务器端程序Nginx已经提供了HTTP协议的解析功能。由此可知,HTTP协议是连接浏览器和服务器程序Nginx之间的桥梁。下图展示了HTTP协议的作用,其中浏览器就是其中的HTTP Clients,Nginx就是其中的HTTP Server。
2.浏览器
市面上有很多浏览器提供给用户选择,这些浏览器有Chrome、Firefox、Edge、Opera等等。Web服务是运行在Internet上的,因此用户一般会借助浏览器来访问和使用这些Web服务。对于用户而言,浏览器需要提供可交互的GUI界面,除此之外,不同的服务,应该提供不同的GUI界面。
浏览器是通过HTML、CSS、Javascript来构建可交互的GUI界面的,因此不同的Web服务若要想提供GUI界面给用户操作,那么就需要根据Web服务所提供的功能来编写许多HTML、CSS、Javascript文件,而这些文件最终都会传输给浏览器,最终由浏览器生成可交互的GUI界面。
3.服务器程序与WSGI协议
Web服务是由许多服务器程序构成的,随着Web服务的复杂性增加,这些服务器程序可以分布在不同的计算机上。不同的服务器程序可以由不同的编程语言来实现,比如C++、Java、Python、Javascript、C#等等。当工程师使用Python编写服务器程序之后,就需要将这些服务器程序提供给浏览器使用,但是由于服务器程序不会解析HTTP协议,因此需要使用Web服务器程序(比如Nginx)来解析HTTP协议。那么Nginx解析的结果就需要传输给Python编写的服务器程序,Nginx与服务器程序是由WSGI协议 来建立通信的。下图展示了服务器程序、Nginx、WSGI协议的关系和作用
- uWSGI和diango是由Python编写的服务器程序,uWSGI提供了解析WSGI协议的功能
- 上图第3部分代表了WSGI协议
- 绿色模块是Web服务器程序Nginx,Nginx负责解析HTTP协议
4.将浏览器、HTTP协议、服务器程序放在一起
由上图可知,用户使用浏览器,经过了6个步骤,最终实现了浏览器访问Web 服务。那么接下来我们通过访问google搜索的例子来学习这6个步骤都做了什么。
- 用户打开浏览器,输入www.google.com,并按下回车键,此时浏览器生成根据HTTP协议生成HTTP请求,假设这个请求是
req1
,发送给Web服务器程序Nginx - Web服务器程序Nginx接收到
req1
,并且根据HTTP协议解析req1
,并得到结果parsed_result_1
- Nginx会将
parsed_result_1
结果通过WSGI协议转发给uWSGI - uWSGI接收到
parsed_result_1
,并根据WSGI协议解析parsed_result_1
得到结果res_dict
,同时将res_dict
转发给基于Python Web框架django编写的服务器程序 - 而服务器程序会查寻数据库,并将查询到的结果和
res_dict
来动态生成HTML内容,而HTML的内容中会包含javascript、css链接。而HTML内容会原路返回给浏览器,此时,浏览器接收到这个HTML内容,并解析HTML内容,加载javascript文件,加载css文件,最后生成了一个可交互的GUI界面
到此,我们从整体上介绍了浏览器、HTTP协议、服务器程序的作用和它们之间关系。这其中涉及了很多成熟的技术栈,比如javascript、css、html、python、django、nginx。读者很难在短时间内把所有的技术都学会,正确的学习技术的思路应该是选择一个一个单一的技术点,然后以点到面的方式学习和扩展自己的技能库。基于这样一个思路,我将选择一个基于Python编写的Web框架来进一步学习Python和Web编程知识。这个Web框架叫digwebs
,它的源码托管在了这里。
目前基于Python编写的Web框架有很多,它们有digwebs
、flask、django,而借助这些Web框架来编写服务器程序会给我们带来很多好处,比如减少服务器程序的代码量、更加高效地组织代码、更好的模块化代码等等。最终借助类似于digwebs
的web框架,可以加快服务器程序的研发速度,同时学习一款优秀开源的web框架可以提高你设计程序的能力。由于Web框架能够给我们带来的这么多好处,在接下来的章节里,我将揭示digwebs
的设计思路和具体细节。