• web框架初识


    web框架的本质

    所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求,服务端按照http协议的响应协议来响应请求,这样的网络通信,我们就可以自己实现Web框架了。
    

    简单的web框架编写

    简单的web框架(返回HTMl页面)

    import socket
    server = socket.socket()
    server.bind(('127.0.0.1', 8896))
    server.listen(5)
    while 1:
        # HTTP请求是一次请求一次响应,在返回数据之后,关闭链接就可以了
        conn, addr = server.accept()
        from_client_data = conn.recv(1024)
        # 获取浏览器访问的路径
        path = from_client_data.decode('utf8').split()[1]
        # 按照HTTP协议规定的方式返回消息
        conn.send(b'HTTP/1.1 200 ok
    
    ')
        # '/'代表的是根路径,就是IP地址后面没有写访问路径
        if path == '/':
            # 打开html文件,以rb的形式读取出来
            with open('test.html', 'rb')as f:
                # 读取的html文件
                data = f.read()
        # 如果访问的是CSS文件路径,将CSS文件读取出来
        elif path == '/style.css':
            with open('style.css', 'rb')as f:
                data = f.read()
        # 如果访问的是JS文件,将js的文件读取出来
        elif path == '/test.js':
            with open('test.js', 'rb')as f:
                data = f.read()
    	#将获取的文件发送给客户端
        conn.send(data)
        conn.close()
    '''
    1:通过浏览器访问上面socket代码中设置的IP地址和端口就能获取到HTML页面的内容
    2:我们的css,js代码单独写在一个文件中的,当我们吧HTMl页面发送给浏览器的时候,浏览器对HTML页面进行渲染,渲染的时候读取HTMl中有导入的css文件和JS文件,就会再次向server端发送请求
    '''
    

    多线程动态返回HTMl页面

    import socket, time
    from threading import Thread
    
    # 客户端通过根路径访问时,服务端返回HTML页面
    def home(conn):
        with open('test.html', 'r', encoding='utf-8')as f:
            new = str(time.time())
            s = f.read()
            #将获取的动态时间替换掉HTML页面中的时间,达到动态返回页面的效果
            s = s.replace('$$xx$$', new)
            conn.send(s.encode('utf-8'))
            conn.close()
    
    # 当客户端通过CSS路径访问的时候,服务端返回CSS文件
    def style(conn):
        with open('style.css', 'rb')as f:
            conn.send(f.read())
            conn.close()
    
    # 当客户端通过JS路径访问的时候,服务端返回CSS文件
    def index(conn):
        with open('test.js', 'rb')as f:
            conn.send(f.read())
            conn.close()
    
    # 当客户端通过请求索要图片的时候,服务端返回图片
    def png(conn):
        with open('1.png','rb')as f:
            conn.send(f.read())
            conn.close()
    
    # 当客户端发送请求索要,ico文件的时候,返回ioc文件
    def ico(conn):
        with open('wechat.ico','rb')as f:
            print('333')
            conn.send(f.read())
            conn.close()
    
    def ind(conn):
        with open('index.html','rb')as f:
            print('333')
            conn.send(f.read())
            conn.close()
    
    
    #定义一个路径和文件的对应列表,节省代码,
    urlList=[(b'/',home),(b'/style.css',style),(b'/test.js',index),(b'/wechat.ico',ico),(b'/index',ind)]
    
    while 1:
        server = socket.socket()
        server.bind(('127.0.0.1',8896))
        server.listen(5)
        conn,addr=server.accept()
        #获取请求路径
        path=conn.recv(1024).split()[1]
        print(path)
        conn.send(b'HTTP/1.1 200 OK
    
    ')
        func=None
        for url in urlList:
            if path==url[0]:
                p=Thread(target=url[1],args=(conn,))
                p.start()
    
    
  • 相关阅读:
    【Luogu】P1419寻找段落(单调队列)
    【Luogu】P1411树(树形高精DP)
    【Luogu】P2886牛继电器(矩阵加速floyd)
    【Luogu】P2657windy数(数位DP)
    【Luogu】P3521ROT-Tree Rotations(线段树合并)
    24-Perl 数据库连接
    23-Perl 面向对象
    22-Perl Socket 编程
    21-Perl 发送邮件
    20-Perl 正则表达式
  • 原文地址:https://www.cnblogs.com/luckinlee/p/11622186.html
Copyright © 2020-2023  润新知