作为一个使用Python的Web工程师,你必须从全局了解浏览器是如何与服务器互联的

作为一个使用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是一个大规模分布式的信息系统,如下图所示

许多应用服务都是运行在Internet上,比如web服务、邮件服务,、文件传输服务,、音频服务、 视频服务等等。比如我们常见的google搜索服务就是web服务中的一种。为了使用这些服务,我们一般都会使用浏览器去访问它们,而这些服务是由许多服务器程序一起提供的,而浏览器会通过HTTP协议向服务器程序发送请求,服务器程序会接收到请求,然后根据请求的内容返回不同的结果。对每一类应用服务,都有与之对应的一套协议,比如文件传输服务就需要通过FTP协议来连接客户端,而web服务一般会通过HTTP协议来连接浏览器。总之,把每台计算机类比成每一个人,那么人与人之间交流需要靠语言来完成,而计算机之间的沟通需要靠协议来完成,而HTTP协议就是众多协议中的一种。

要想使用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个步骤都做了什么。

  1. 用户打开浏览器,输入www.google.com,并按下回车键,此时浏览器生成根据HTTP协议生成HTTP请求,假设这个请求是req1,发送给Web服务器程序Nginx
  2. Web服务器程序Nginx接收到req1,并且根据HTTP协议解析req1,并得到结果parsed_result_1
  3. Nginx会将parsed_result_1结果通过WSGI协议转发给uWSGI
  4. uWSGI接收到parsed_result_1,并根据WSGI协议解析parsed_result_1得到结果res_dict,同时将res_dict转发给基于Python Web框架django编写的服务器程序
  5. 而服务器程序会查寻数据库,并将查询到的结果和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的设计思路和具体细节。

posted @ 2019-05-21 21:31  紫云~~  阅读(249)  评论(0编辑  收藏  举报