最近开始使用Python写服务端,在培训开始时要求从Web前端开始学,从而为以后写服务端打下基础,同时技多不压身,学习Web开发可以多学一种技能,更深入了解网络通信,了解服务端应该怎么为前端服务。俗话说得好不懂前端的后台不是好策划,所以进入了一段疯狂学习的时间。在各种查询百度、谷歌、官方文档过程中,收获颇丰,喝水不忘挖井人,写下这博客也把自己遇到的困惑点、感悟较深点和对自己帮助较大的知识记录下来,以便能帮助到需要帮助的程序猿。
首先在学习过程中,被要求不能直接使用高度集成化的Django框架,要求从基本原理和框架开始学,主要学习的内容有:Nginx、WSGI、jinja2还有就是html、css、JavaScript。当时第一反应就完全懵了,完全不知道如何下手。经过一个个知识点的学习,慢慢开始了解上述Nginx是轻量级Web服务器,WSGI全称Web Server Gateway Interface是一种协议,Jinja2是基于python的模板引擎用来动态生成Html文件的,虽然知道了它们各自的作用和功能,可是还是无法把它们的关系组织起来,无法明白它们在Web开发整个系统的各自流程和作用。
经过短时间学习,当然实践是最好的学习方法,自己动手把Web小项目搭建起来,然后都尽可能使用到上述的Nginx、WSGI、 uWSGI、jinja2等内容,再加上谷歌老师的指导,总算把它们的关系理清了。
概括来说,客户端(浏览器)发送一个 HTTP 请求到服务器处理请求,分别经过了 web服务器层(NginX 、Apache),WSGI层,web应用层(Flask,Django),这三个层次。不同的层次其作用也不同,总体流程图如下图所示:
传统的网络通信是client-serve模型,web服务器在Web开发中是直接与client(浏览器等)直接通信。如上图三层模型,web服务器主要的任务是: 1. 接受client的请求, 2. 然后解析client的请求构造environ字典和start_response函数,从而符合WSGI协议的规范。 3. 等Web应用层处理完后返回处理结果,最后web服务器拿到结果生成请求响应,把响应发送给client,web服务器的任务完成。
下面是个简单的服务器Web实现版,可以参考着看,会让你明白服务器到底干了什么工作和怎么完成这写工作。 https://blog.csdn.net/a519640026/article/details/76157976
Nginx就是服务器,uWSGI中也实现了轻量级,而wsgiref.simple_server中同样也实现了轻量级单线程服务器。
WSGI全称:Web Server Gateway Interface。WSGI位于web应用程序与web服务器之间,WSGI是Python应用程序或框架和Web服务器之间的一种接口。WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。 简单例子:
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return 'Hello, web!
'
上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:environ:一个包含所有HTTP请求信息的dict对象(Web服务器给的上一章节中介绍到); start_response:一个发送HTTP响应的函数(Web服务器给的,上一章节中介绍到) 通过这个接口,web应用程序与web服务器便可以通信,如上图三层所示。 uWSGI中也实现了WSGI接口,而wsgiref.simple_server中同样也实现了WSGI协议接口。
简单解释就是上诉WSGI协议中application函数的实现,用来完成后台所有任务,包括数据库处理,HTML文件的生成等等。然后返回响应状态和响应结果给服务器,最后服务器便能构成client的请求响应,并返回给client,从而完成这次请求任务,完成一次网页请求。Flask、Django便是常用的应用层框架。
上述的应用层框架或者模板实例框架都不仅仅是简单的实现某一层,例如Django它则是三层都有涉及都有实现,所以明白原理和流程是最重要的。