zoukankan      html  css  js  c++  java
  • django(1)

    web框架本质

    所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。

    import socket
    
    sk = socket.socket()
    sk.bind(("127.0.0.1", 80))
    sk.listen()
    
    
    while True:
        conn, addr = sk.accept()
        data = conn.recv(8096)
        print(data)  # 将浏览器发来的消息打印出来
        conn.send(b"OK")
        conn.close()
    
    访问127.0.0.1:80  页面能显示ok字样
    可以conn.send(b"OK")这种形式
    
    
    GET / HTTP/1.1
    Host: 127.0.0.1
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    Cookie: Hm_lvt_ba7c84ce230944c13900faeba642b2b4=1528700314; Hm_lpvt_ba7c84ce230944c13900faeba642b2b4=1528701771

    
    
    非http版本的response header 信息 
    有点晕了,为什么是一样的呢?


    服务端打印的信息(浏览器发过来的信息)
    b'GET /index HTTP/1.1 Host: 127.0.0.1 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: Hm_lvt_ba7c84ce230944c13900faeba642b2b4=1528700314; Hm_lpvt_ba7c84ce230944c13900faeba642b2b4=1528700435 ' b'GET /favicon.ico HTTP/1.1 Host: 127.0.0.1 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36 Accept: image/webp,image/apng,image/*,*/*;q=0.8 Referer: http://127.0.0.1/index Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: Hm_lvt_ba7c84ce230944c13900faeba642b2b4=1528700314; Hm_lpvt_ba7c84ce230944c13900faeba642b2b4=1528700435 ' 第一段有请求方法,用户访问页面的路径,
    只有str能被split,bytes类型不能
     
    import socket
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('127.0.0.1', 8000))
    sock.listen()
    
    while True:
        conn, addr = sock.accept()
        data = conn.recv(8096)
        # 给回复的消息加上响应状态行
        conn.send(b"HTTP/1.1 200 OK
    
    ")
        conn.send(b"OK")
        conn.close()
    
    http版
    GET / HTTP/1.1
    Host: 127.0.0.1:8000
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    Cookie: Hm_lvt_ba7c84ce230944c13900faeba642b2b4=1528700314; Hm_lpvt_ba7c84ce230944c13900faeba642b2b4=1528701753

    http版本的response header 信息


    b'GET / HTTP/1.1 Host: 127.0.0.1:8000 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: Hm_lvt_ba7c84ce230944c13900faeba642b2b4=1528700314; Hm_lpvt_ba7c84ce230944c13900faeba642b2b4=1528702117 '
    b'GET /favicon.ico HTTP/1.1 Host: 127.0.0.1:8000 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36 Accept: image/webp,image/apng,image/*,*/*;q=0.8 Referer: http://127.0.0.1:8000/ Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: Hm_lvt_ba7c84ce230944c13900faeba642b2b4=1528700314; Hm_lpvt_ba7c84ce230944c13900faeba642b2b4=1528702117 '

    返回具体的动态的HTML页面+函数进阶版

    """
    根据URL中不同的路径返回不同的内容--函数进阶版
    返回HTML页面
    让网页动态起来
    """
    
    import socket
    import time
    
    sk = socket.socket()
    sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口
    sk.listen()  # 监听
    
    
    # 将返回不同的内容部分封装成函数
    def index(url):
        with open("index.html", "r", encoding="utf8") as f:
            s = f.read()
            now = str(time.time())
            s = s.replace("@@oo@@", now)  # 在网页中定义好特殊符号,用动态的数据去替换提前定义好的特殊符号
        return bytes(s, encoding="utf8")
    
    
    def home(url):
        with open("home.html", "r", encoding="utf8") as f:
            s = f.read()
        return bytes(s, encoding="utf8")
    
    
    # 定义一个url和实际要执行的函数的对应关系
    list1 = [
        ("/index/", index),
        ("/home/", home),
    ]
    
    while 1:
        # 等待连接
        conn, add = sk.accept()
        data = conn.recv(8096)  # 接收客户端发来的消息
        # 从data中取到路径
        data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串
        # 按
    分割
        data1 = data.split("
    ")[0]
        url = data1.split()[1]  # url是我们从浏览器发过来的消息中分离出的访问路径
        conn.send(b'HTTP/1.1 200 OK
    
    ')  # 因为要遵循HTTP协议,所以回复的消息也要加状态行
        # 根据不同的路径返回不同内容
        func = None  # 定义一个保存将要执行的函数名的变量
        for i in list1:
            if i[0] == url:
                func = i[1]
                break
        if func:
            response = func(url)
        else:
            response = b"404 not found!"
    
        # 返回具体的响应消息
        conn.send(response)
        conn.close()
    

      

  • 相关阅读:
    Confluence5.6.6安装和破解
    Redis 数据备份与恢复
    Linux Shell
    戴尔R720安装ESXI系统
    zbb20171223 vm12 Vmware虚拟机设置静态IP地址
    zbb20171221 bootstrap 模态窗口
    zbb20171221 thymeleaf 格式化工具 工具对象用法
    zbb20171221 thymeleaf 基本语法
    zbb20171221 thymeleaf th:each
    zbb20171215 maven pom 包命名搜索地址
  • 原文地址:https://www.cnblogs.com/shanjinghao/p/9167299.html
Copyright © 2011-2022 走看看