Django web框架本质

一、所有WEB框架的本质都是一个socket链接
所有web框架的本质都是一个socket链接。而Django是使用Python开发的提供功能最大最全的个框架 所有python web框架核心可用下面一段py代码展示:
import socket

def handle_request(server):
    buffer = server.recv(1024)
    server.send('HTTP///200 OK \r\n\r\n".encode())
    server.send('你好,这是web'.encode())


def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((IP, PORT))
    sock.listen(5)
    while True:
        conn, addr = sock.accept()
        handle_request(conn)
        conn.close()

if __name__ == '__main__':
    main()
1.2 wsgi规则(协议)下的实现

django 默认调用的socket就是满足wsgi规则的 wsgiref模块
使用wsgiref 写一个简单的web

from wsgiref.simple_server import make_server

def index(request):
    """
    :param request: 里面封装了所有客户端发来的数据
    :return: 返回给客户端的页面
    """
    #做好相应处理,如验证,然后打开页面文件,然后返回页面
    f = open('index.html', 'rb')
    file = f.read()
    return [ file, ]

def home(request):
    #同上面一样,不过返回不同页面
    pass

URL_DICT = {
    '/index': index,
    '/home': home,
    #等等很多页面
}

def Run_server(environ, start_response):
    """
    :param environ: 里面封装了客户端发来所有数据,如url,请求头,状态,浏览器信息等
    :param start_response: 该参数用来封装返回给用户的数据。响应头 响应状态等
    :return: 返回给客户端页面内容
    """
    start_response('200 OK', [('Content-Type', 'text/html')])
    
    current_url = environ['PATH_INFO']  #拿到请求的url
    #查看本地是否有该url服务
    if current_url in URL_DICT:
        res = URL_DICT[current_url](environ)  #本地提供该url服务,拿到地址直接运行
    else:
        res = ['<div style='margin:0 auto;'><center>404 not found </center></div>'.encode(), ]  #请求的url不存在,返回404页面
    
    return res 

if __name__ == '__main__':
    httpd = make_server('', 8000, Run_server)
    httpd.serve_forver()

wsgiref模块内部封装了一个socket server,只要来一个请求就是调用一次 run_server

posted @ 2018-09-07 22:54  G1733  阅读(91)  评论(0编辑  收藏  举报