因为 python 代码的优雅美观且易于维护这一特点, 越来越多的人选择使用 Python 做 web 开发而 Python 的 Web 框架百花齐放, 目前比较流行的框架有大包大揽的 Django, 小巧灵活的 FlaskBottle, 还有性能高效的异步框架 Tornadosanic 这么多框架只要选择一个, 阅读他的文档, 就可以很轻松的搭建一个 web app, 完全不需要去管他实现的原理
本篇文章意在对一个 web 开发做一个梳理
前端网页三剑客
我们打开浏览器输入一个网址 yukunweb.com, 然后就看到了浏览器给我们显示的页面, 这个时候打开浏览器开发者工具, 点击 Network, 刷新页面, 会看到下方的请求的 url, 点击 Response, 就可以看到服务器返回给浏览器的 html 文件信息了如果复制 Response 响应的内容, 保存为 index.html 并且在浏览器打开, 依然可以看到首页的内容, 但是似乎缺少了一些页面的样式和功能
这是因为当浏览器接收到首页的 HTML 源码后, 它会根据 HTML 的规则去显示页面, 然后再根据 HTML 里的链接, 自动发送 HTTP 请求给服务器, 拿到相应的图片, 和 JavaScriptCSS 等资源, 最终显示出一个完整的页面所以我们会在 Network 下面能看到很多额外的以. js,.css 等后缀的请求了
其实我们看到的页面就是浏览器按照 HTML 的规则, 展示给我们的 HTML 告诉浏览器那里是导航, 那里是主栏, 那里是侧栏而这些信息如何显示, 或者是显示的样式, 就是 CSS 文件的功劳至于比如导航的下拉隐藏上拉显示就是 JavaScript 的作用
如果想要做 Web 开发, 就一定得熟悉 HTMLCSSJavaScript 三剑客的知识, 这里推荐 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/1.1 200 OK
开头的部分仍然是服务器对应的 HTTP 版本, 紧接着的 200 OK 表示请求的处理结果的状态码 (status code) 和原因短语 200 状态码就表示响应成功, 常见的 404 表示访问错误, 500 表示服务器响应错误这里的 OK 是没有固定的规则的, 你也可以让他返回 GOOD 啥的
下一行是服务器信息, 本站用的是 Nginx 服务器, 在下一行显示了创建响应的日期时间在下一行的 Content-Type 表示内容的类型, 客户端会依赖他判断响应的内容是网页还是音频, 图片等类型
- 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()
- 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()
来源: http://www.jqhtml.com/13251.html