后端开发

174 阅读1分钟
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()