广州北大青鸟计算机职业培训学校
互联网技术培训、软件技术培训、大数据培训、云计算培训、数据分析培训信息网
当前位置:网站首页 > 计算机学校 > 正文

理解Python web开发,轻松搭建web app!_惠州计算机Python培训学校

作者:黄君发布时间:2021-05-23分类:计算机学校浏览:779


导读:因为 python代码的优雅美观且易于维护这一特点,越来越多的人选择使用 Python做Web开发。而 Python的 Web框架百花齐放,目前比较流行的框架有大包大揽的 Django,小巧灵活的 Flask、 Bottle,还有性能高效的异步框架 Tornado、 sanic。这么多框架只要选择一个,阅读他的文档,就可以很轻松的搭建一个 web app,完全不需要去管他实现的原理。

下文意在对一个web开发做一个梳理。

我们打开浏览器输入一个网址 yukunweb.com,然后就看到了浏览器给我们显示的页面,这个时候打开浏览器开发者工具,点击 Network,刷新页面,会看到下方的请求的 url,点击 Response,就可以看到服务器返回给浏览器的 html文件信息了。如果复制 Response响应的内容,保存为 index.html并且在浏览器打开,依然可以看到首页的内容,但是似乎缺少了一些页面的样式和功能。

这是因为当浏览器接收到首页的 HTML源码后,它会根据 HTML的规则去显示页面,然后再根据 HTML里的链接,自动发送HTTP请求给服务器,拿到相应的图片,和 JavaScript、 CSS等资源,最终显示出一个完整的页面。所以我们会在 Network下面能看到很多额外的以 .js, .css等后缀的请求了。

其实我们看到的页面就是浏览器按照 HTML的规则,展示给我们的。 HTML告诉浏览器那里是导航,那里是主栏,那里是侧栏。而这些信息如何显示,或者是显示的样式,就是 CSS文件的功劳。至于比如导航的下拉隐藏上拉显示就是 JavaScript的作用。

如果想要做Web开发,就一定得熟悉 HTML、 CSS、 JavaScript三剑客的知识,这里推荐W3school的前端教程,也是我学习前端的地方:W3school

客户端和服务器通信

理解了前段三剑客,就知道如何去写一个网页。那么从我们在浏览器的地址栏输入 URL,到 Web页面呈现出来到底经历了什么。

一般这种通过发送请求获取服务器资源的Web浏览器,都可以称为客户端(client)。首先发送一个请求(request)给服务器,大多是以GET请求方式访问,服务器接收到你的请求,然后取到请求的资源,返回给客户端。

服务器和客户端之间交流是怎么进行的呢,服务器是怎么理解客户端的请求的呢。这里就需要一种协议规范,就是HTTP(HyperText Transfer Protocol,超文本传输协议)。可以说, Web是建立在 HTTP协议上通信的。

仍然是之前的例子,打开浏览器访问 yukunweb.com,打开浏览器开发者工具,点击图中标记的选项卡(记得点view parsed),可以看到客户端发给服务器的请求头前两行。


GET / HTTP/1.1

Host: www.yukunweb.com

第一行开头的GET表示请求访问服务器的类型,称为方法(method)。随后的字符 /指明了请求访问的资源对象,即请求URI。最后的 HTTP/1.1,即HTTP的版本号,用来提示客户端使用的 HTTP协议功能。

综上所述,第一行请求内容的意思是:请求访问某台 HTTP服务器上的 /(首页)页面资源。所以第二行的 Host表示请求的域名也就是服务器所在地址。

如果是 POST请求的话,不仅会有请求头部信息,还有一个 Form Data的请求实体内容。

接收到请求的服务器呢,他会将请求内容的处理结果以响应的形式返回,看图中的第一行:

开头的部分仍然是服务器对应的 HTTP版本,紧接着的 200 OK表示请求的处理结果的状态码 (status code) 和原因短语。 200状态码就表示响应成功,常见的 404表示访问错误, 500表示服务器响应错误。这里的 OK是没有固定的规则的,你也可以让他返回 GOOD啥的。

下一行是服务器信息,本站用的是 Nginx服务器,在下一行显示了创建响应的日期时间。在下一行的 Content-Type表示内容的类型,客户端会依赖他判断响应的内容是网页还是音频,图片等类型。

这里只是简单的介绍了 HTTP协议,即是客户端与服务器之间的通信协议。如果想要深入了解推荐阅读《HTTP权威指南》。

WSGI

如果你浏览一个地址 http://www.yukunweb.com/search-result/?keywords=音乐,你会访问到本站的音乐关键词的搜索结果。我们知道客户端发送请求给服务器,那么服务器是怎么拿到资源的呢。其实这是交给后端运行的应用返回的,好比你抓取一个页面到获取到信息,这些逻辑的处理肯定是我们的程序再跑。

但是,接收并且解析客户端的 HTTP请求在发送 HTTP响应这些底层操作,后端的程序肯定是不会去处理的。所以,要想只专注于Web业务逻辑,还需要一个服务器和 web应用之间的嫁接层————WSGI。

什么是WSGI(Web Server Gateway Interface)?

WSGI翻译过来就是Web服务器网关接口。他只是一个规范,定义了 Web服务器如何与 Python应用程序进行交互,使得使用 Python写的 Web应用程序可以和Web服务器(nginx/apache)对接起来。

该规范的地址:PEP 333

WSGI是 Python的Web开发的基石,有了它你就有了一切,它存在的目的有两个:

描述 Web 服务器如何与 Web 应用程序交互(将客户端请求传给应用程序),

描述 Web 应用程序如何处理请求和如何返回数据给服务器。

由于 Python内置的标准库里有一个 WSGI库 wsgiref,我们基于他来写一个体现 WSGI目的的例子:


from wsgiref.simple_server import make_server

def application(environ, start_response):

status = '200 OK'

response_headers = [('Content-type', 'text/html')]

start_response(status, response_headers)

body = 'Hello, {name} !!!'.format(name=environ['PATH_INFO'][1:] or 'WSGI')

return [body.encode('utf-8')]

app = make_server('', 8000, application)

app.serve_forever()

运行程序,如果没有报错,此时打开浏览器输入地址 127.0.0.1:8000和 127.0.0.1:8000/GuTianle,就可以看到程序返回的页面了。

我们可以看到一个请求,他的入口只需要一个 WSGI的处理函数。因为所有的请求信息都包含在 environ中,这样我们就可以根据这些信息去返回不同的数据。

参数:

environ:字典类型,存放了所有和客户端相关的信息。如果想知道他里面有哪些参数,可以更改上面的代码在 return 行上面加一个 for k, v in environ.items()的循环,打印出字典里的所有参数。

startresponse:一个可调用对象,接收两个必选参数和一个可选参数:

status: 一个字符串,表示 HTTP 响应状态字符串,如 200,404

responseheaders: 一个列表,包含有如下形式的元组:(headername, headervalue),用来表示 HTTP 响应的 headers ,如('Content-type', 'text/html')

exc_info(可选): 用于出错时,服务器需要返回给浏览器的信息

返回:一个可迭代对象, 服务器通过遍历这个可迭代对象可以获得body的全部内容,内容可以是 html也可以是 json。

这里简单的介绍了 WSGI是什么,干什么。如果理解了 WSGI,那么写一个 Python的Web框架就很简单了。这也是为什么 Python有成百上千web框架的原因。

实现基于WSGI的框架

上面我们理解了 WSGI是干什么的,那么我们基于它实现一个简单的 web框架可以说轻而易举了。


from wsgiref.simple_server import make_server

class Application(object):

def __init__(self, environ, start_response):

self.start_response = start_response

self.path = environ['PATH_INFO']

def __iter__(self):

if self.path == '/':

status = '200 OK'

response_headers = [('Content-type', 'text/html')]

self.start_response(status, esponse_headers)

yield 'Hello,World!'.encode('utf-8')

elif self.path == '/wsgi':

status = '200 OK'

response_headers = [('Content-type', 'text/html')]

self.start_response(status, response_headers)

yield 'Hello,WSGI!'.encode('utf-8')

else:

status = '404 NOT FOUND'

response_headers = [('Content-type', 'text/html')]

self.start_response(status, response_headers)

yield '404 NOT FOUND'.encode('utf-8')

if __name__ == "__main__":

app = make_server('127.0.0.1', 8000, Application)

print('Serving HTTP on port 8000...')

app.serve_forever()

这个 Application类只不过是对 WSGI又做了一层简单的封装而已,由于上面说过 WSGI函数返回的是一个可以迭代对象,所以需要实现一个iter方法,里面控制了客户端的请求路由并且返回不同的输出。

当然如果你想扩展成一个像样的框架还需要考虑很多,比如像 flask那样方便的路由系统,还有对于用户请求方式的处理等等。总之是个很需要折腾的过程,好比 flask的0.1版本去掉注释也就 200 多行,而如今最新版本。


点击咨询直接了解更多相关资料,我在惠州北大青鸟新方舟等你。

 

本文内容转载自网络,版权归原作者所有,如有侵权请联系我们进行删除。


标签:惠州计算机软件培训惠州计算件软件开发惠州计算机软件基础惠州计算机Python软件开发惠州Python培训学校惠州Python培训python基础教程python是什么python教程python入门


计算机学校排行
标签列表
网站分类
文章归档
最近发表