CS编程:客户端、服务端编程
BS编程:Browser、Server编程
HTTP协议 无状态协议 为了解决无状态,cookie就是解决方案之一(cookie对应B端,session对应S端)
URL组成
http://www.magedu.com/python/index.html?id=5&name=python
scheme协议 http
host:port www.magedu.com 80位默认端口不写
path /python/index.html
query string id=5 name=python
http消息
Request-Response
请求方法:
GET 请求获取URL对应的资源
POST 提交数据至服务器
HEAD 和GET类似 不过不返回正文
无状态-短连接-长连接
无状态 http的每次请求都是无状态的,解决方案是cookie-session
短连接 http1.1之前,一个请求一个连接,但是这样tcp的创建销毁成本太高,所有诞生了http1.1,http1.1默认开启长连接,可设置时长
长连接 http1.1之后支持keep-alive,默认开启,可设置,一个连接tcp连接建立后,会保持一段时间,浏览器再次请求时,会继续只用这个连接
WSGI
WSFI主要规定了服务与应用程序间的接口
environ
environ是包含Http请求信息的dict对象
REQUEST_METHOD 请求方法,GET、POST等
PATH_INFO URL中的路径部分
QUERY_STRING 查询字符串
SERVER_NAME, SERVER_PORT 服务器名、端口
HTTP_HOST 地址和端口
SERVER_PROTOCOL 协议
HTTP_USER_AGENT UserAgent信息
start_reponse
它是一个可调用对象。有3个参数,定义如下:
start_response(status, response_headers, exc_info=None)
status 是状态码,例如 200 OK
response_headers 是一个元素为二元组的列表,例如[('Content-Type', 'text/plain;charset=utf-8')]
exc_info 在错误处理的时候使用
start_response应该在返回可迭代对象之前调用,因为它返回的是Response Header。返回的可迭代对象是
Response Body。
APP三种实现方法
res_str = b'magedu.com ' # 函数实现 def application(environ, start_response): return [res_str] # 类实现 class Application: def __init__(self, environ, start_response): pass def __iter__(self): # 实现此方法,对象即可迭代 yield res_str # 类实现 class Application: def __call__(self, environ, start_response): return [res_str]
测试命令
$ curl -I http://192.168.142.1:9999/xxx?id=5 $ curl -X POST http://192.168.142.1:9999/yyy -d '{"x":2}'
-I 使用HEAD方法
-X 指定方法,-d传输数据
简单实现WSGI框架(server端)
demo_app
from wsgiref.simple_server import make_server, demo_app ip = '127.0.0.1' port = 9999 server = make_server(ip, port, demo_app) server.serve_forever()
simple_server
from wsgiref.simple_server import make_server def application(environ, start_response): status = "200 ok" headers = [('Content-Type', 'text/html;charset=utf-8')] start_response(status, headers) html = '<h1>hello magedu</h1>'.encode("utf-8") return [html] ip = '127.0.0.1' port = 9999 server = make_server(ip, port, application) server.serve_forever()
WEB服务器
本质上就是一个TCP服务器,监听在特定端口上
支持HTTP协议,能够将HTTP请求报文进行解析,能够把响应数据进行HTTP协议的报文封装并返回浏览器
端。
实现了WSGI协议,该协议约定了和应用程序之间接口(参看PEP333,https://www.python.org/dev/peps/p
ep-0333/)
APP应用程序
遵从WSGI协议
本身是一个可调用对象
调用start_response,返回响应头部
返回包含正文的可迭代对象