http协议特征
-
1.基于TCP/IP协议
-
2.短连接
-
3.被动响应
-
4.无状态
用Socket实现一个web服务
impotr Scoket
def main():
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind('localhost',8000)
sock.listen(5)
while True:
# 等待浏览器访问
conn,addr=sock.accept()
# 接收浏览器发送来的请求内容
data=conn.recv(1024)
print(data)
# 给浏览器返回内容
conn.send(b"HTTP//1.1 20 ok \r\nContent-type:text/html; charset=utf-8\r\n\r\n")
conn.send("<h1 style='color:red'>Hello Word</h1>".encode("utf-8"))
#关闭和浏览器创建的socker连接
conn.close()
if__name__=="__main__"
main()
WSGI
定义了使用python编写的web app(应用程序)与web server(socker服务端)之间的接口格式,实现两者之间的解耦
用wsgiref实现一个web服务
environ:一个包含所有HTTP请求信息的dict对象;
start_response:一个发送HTTP响应的函数。
from wsgiref.simple_server import make_server
def run_server(environ,start_response)
print('hello',environ)
start_response("200 OK",[('Content-type','text/html;charset=utf-8')])
return [bytes('<h2>wsgire实现web服务</h2>',encoding="utf-8")]
s=make_server('localhost',8000,run_server)
s.server_forever()
使用路由分发器,负责把url匹配到对应的函数
def book(environ,start_response):
print("book page")
start_response("200 ok",[('Content-Type','text/html;charset=utf-8')])
return [bytes('<h2>book page!</h2>',encoding="utf-8")]
def cloth(environ,start_response):
print("cloth page")
start_response("200 ok",[('Content-Type','text/html;charset=utf-8')])
return [bytes('<h2>cloth page</h2>',encoding="utf-8")]
def url_dispacher(): #路由分发器
urls={
'/book':book,
'/cloth':cloth,
}
return urls
def run_server(environ,start_response):
print('hahahaha',environ)
url_list=url_dispacher() #拿到所有的url
request_url=environ.get("PATH_INFO")
print('request url',request_url)
if request_url in url_list:
func_data=url_list[request_url](environ,start_response)
return func_data
else:
start_response("404",[('Content-Type','text/html;charset=utf-8')])
return [bytes('<h1 style="font-size:50px">404,Page not found!</h1>',encoding="utf-8")]
s=make_server('localhost',8000,run_server)
s.server_forever()