一、B/S开发和HTTP协议
C/S:即客户端、服务器编程
客户端与服务器之间使用Socket,约定协议、版本(一般使用TCP或者UDP),指定地址和端口,就可通信了。
B/S:即浏览器、服务器编程
Browser浏览器,一种特殊的客户端,支持HTTP(s)协议,能够通过URL向服务器发送请求,等待服务端返回HTML等数据,并在浏览器内可视化展示的程序。
Server:支持HTTP(s)协议,能够接受众多客户端发起的HTTP请求,经过处理,将HTML等数据返回给浏览器。
本质上:BS是一种特殊的CS,即客户端必须一种支持HTTP协议且能够解析并渲染HTML的软件,服务器必须是能够接收多个客户端HTTP访问的服务器软件。
HTTP协议底层基于TCP协议实现。
BS开发分为两端开发:
(1)客户端开发,或称前段开发。HTML、CSS、JavaScript等;
(2)服务端开发,Python有WSGI、Django、Flask、Tornado等;
HTTP协议:
是一种无状态协议。
同一个客户端的两次请求之间没有任何关系,从服务器端角度说,他不知道这两个请求来自一个客户端。
cookie
键值对信息。
浏览器发起每一请求时,都会把cookie信息发给服务器。
是一种客户端、服务器端传递数据的技术;
服务端可以通过判断这些信息,来确定这次请求是否和之前的请求有关联;
一般来说cookie信息是在服务器端生成,返回给客户端的;
客户端可以自己设置cookie信息。
URL组成
uniform resource locator 统一资源定位符。
scheme模式、协议:
http、ftp、https、file、mailto等等。mysql等都是类似这样写。
host:port
响应:
status code状态码
状态码在响应头第一行
1xx 提示信息,表示请求已被成功接收,继续处理
2xx 表示正常响应
200 正常返回网页内容
3xx 重定向
301 页面永久性移走,永久重定向。返回新的URL,浏览器会根据返回的url发起新的request请求
302 临时重定向
304 资源未修改,浏览器使用本地缓存
4xx 客户端请求错误
404 Not Found,网页找不到,客户端请求的资源有错
400 语法请求错误
401 请求要求身份验证
403 服务器拒绝请求
5xx 服务器端错误
500 服务器内部错误
502 上游服务器错误,例如nginx反向代理的时候
二、WSGI
WSGI服务器的作用:
(1)监听HTTP服务端口(TCPServer,默认端口80);
(2)接收浏览器端的HTTP请求并解析封装成environ环境数据;
(3)负责调用应用程序,将environ和start_response方法传入;
(4)将应用程序响应的正文封装成HTTP响应报文返回浏览器;
WSGI APP应用程序端
(1)应用程序应该是一个可调用对象;
Python中应该是函数、类、实现了__call__方法的类的实例
(2)这个可调用对象应该接收两个参数;
1 # 1 函数实现
2 def application(environ, start_response):
3 pass
4
5 # 2 类实现
6 class Application:
7 def __init__(self, environ, start_response):
8 pass
9
10 # 3 类实现
11 class Application:
12 def __call__(self, environ, start_response):
13 pass
View Code
(3)以上的可调用对象实现,都必须返回一个可迭代对象
1 res_str = b'magedu.com\n'
2
3 # 函数实现
4 def application(environ, start_response):
5 return [res_str]
6
7 # 类实现
8 calss Application:
9 def __init__(self, environ, start_response):
10 pass
11 def __iter__(self): #实现此方法,对象即可迭代
12 yield res_str
13
14 # 类实现
15 class Application:
16 def __call__(self, environ, start_response):
17 return [res_str]
可调用对象,返回可迭代对象
environ和start_response这两个参数名可以是任何合法名,但是一般默认都是这2个名字。
应用程序端还有其他的规定,暂不用关心。
environ
start_response
WEB服务器
·本质上就是一个TCP服务器,监听在特定端口上;
·支持HTTP协议,能够将HTTP请求报文进行解析,能够把响应数据进行HTTP协议的报文封装并返回浏览器端;
·实现了WSGI协议,该协议约定了和应用程序之间接口。
APP应用程序
·遵从WSGI协议;
·本身是一个可调用对象;
·调用start_response,返回相应头部;
·返回包含正文的可迭代对象。
三、类Flask框架请求封装
完成一个WSGI的web框架,从而了解WEB框架的内部机制。
WSGI请求environ处理
WSGI服务器程序会帮我们处理HTTP请求报文,但是提供的environ还是一个用起来不方便的字典。
parse_qs函数:将同一个名称的多值,保存在字典中,使用了列表保存。
enciron的解析——webob库
四、Response使用及wsgify装饰器