• WEB框架初识


    HTTP介绍

    Hyper Text Transfer Protocol,超文本传输书协议,是万维网数据通信的基础,规定了请求和响应标准。

    HTTP工作原理

    HTTP 请求以及响应的步骤

    1. 客户端连接到Web服务器。一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接;

    2. 发送HTTP请求。通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成,其中空行的作用是告诉服务端接下来是请求体部分。

    3. 服务器接受请求并返回HTTP响应。Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

    4. 释放连接TCP连接。若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

    5. 客户端浏览器解析HTML内容。客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

    在浏览器地址栏输入URL,按下回车后发生的事

    1. 浏览器向 DNS 服务器请求解析该URL中的域名所对应的 IP 地址;

    2. 解析出 IP 地址后,根据该IP地址和默认端口80,和服务器建立TCP连接;

    3. 浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

    4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

    5. 释放 TCP连接;

    6. 浏览器将该 html 文本内容显示出来。

    请求方法

    HTTP/1.1协议中共定义了八种方法,也可以说是动作

    GET

    获取指定的资源的请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中。

    POST

    向指定资源提交数据,请求服务器进行处理,该操作传输实体内容资源,例如提交表单或者上传文件。

    HEAD

    获得报文首部。与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

    PUT

    更新资源,向指定资源位置上传其最新内容。

    DELETE

    删除文件,请求服务器删除Request-URI所标识的资源。

    TRACE

    回显服务器收到的请求,主要用于测试或诊断。

    OPTIONS

    允许客户端查看服务器的性能。这个方法可使服务器传回该资源支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

    CONNECT

    HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

    注意事项

    1. 方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

    2. HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法是可选的。所有的方法的实现都应当匹配各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如PATCH(由 RFC 5789 指定的方法)用于将局部修改应用到资源

    POST和GET的区别?

    • GET参数通过URL传递,POST放在Request body(请求主体)中。

    • GET在浏览器回退时是无害的,而POST需再次提交请求。  

    • GET产生的URL地址可以被Bookmark,而POST不可以。  

    • GET请求会被浏览器主动cache,而POST不会,除非手动设置。  

    • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。  

    • GET请求在URL中传送的参数是有长度限制的(2kb 不同浏览器也会有所不同),而POST没有。  

    • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。  

    • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

    • GET请求只能进行url编码 -- encodeURIComponent(),而POST支持多种编码方式。

    • POST数据的格式与查询字符串格式相同,如果需要将页面中表单的数据进行序列化,然后再通过 XHR 发送到服务器,可以使用 serialize()函数来创建这个字符串,也就是表单序列化

    HTTP状态码

    所有HTTP响应的第一行都是状态行,依次表示的是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

    状态码一共分为五级:

    • 1XX ----服务器已接收请求,需进一步处理

    • 2XX----请求被服务器接收、理解并处理

      • 200: ok

      • 206:“Partial Content”响应: 客户端发送了一个带有Range请求头的Get请求,是表明自己只需要url上部分的资源,服务器完成了它。 比如:video audio播放一个很大的视频/音频地址时,一般会返回206

    • 3XX ----重定向,执行后续的操作,继续完成请求

      • 301: 永久重定向,所请求的页面已经转移至新的URL

      • 302: 临时重定向

      • 304:缓存,服务器告诉浏览器可以直接使用缓存,不用请求服务器了

    • 4XX ----请求错误 ,请求含有词法错误或者无法被执行

      • 400: 客户端语法错误

      • 401: 请求授权失败

      • 403: 请求不允许 Forbidden资源禁止被访问

      • 404: 没有发现文件、查询或URl

    • 5XX ----服务器接受请求时发生错误

      • 500:服务器不可预计的错误

      • 501: "Internal Server Error" 服务器端在执行请求时发生了错误,此时服务器并没有正常工作

      • 503: 服务器当前不能处理客户端的请求 临时过载和当机

      • 504: 服务器没连上

      • 505: 服务器不支持或拒绝支请求头中指定的HTTP版本

    RFC 2616 中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是WEB开发过程中还是能够自定义状态描述或者自定义信息。

    URL介绍

    Uniform Resource Locators,统一资源定位器

    组成:

    • scheme传送协议,例如http,ftp,https

    • 层级URL标记符号//固定不变

    • 访问资源需要的凭证信息(可省略)

    • 服务器,(通常为域名,有时为IP地址)

    • 端口号,(以数字方式表示,若为HTTP的默认值“:80”可省略)

    • 路径,(以“/”字符区别路径中的每一个目录名称)

    • 查询,(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)

    • 片段。以“#”字符为起点,锚点

    http://www.jjzz.com:80/news/index.html?id=250&page=1

    传输协议:http 服务器:www.jjzz.com 端口:80 路径:/news/index.html 查询:?id=250&page=1

    HTTP请求和响应格式

    请求格式request

    请求格式

    【注意】get的请求包中没有请求数据部分。

    响应格式response

    响应报文

    web框架的功能

    1. 收发消息,包含的模块有wsgi wsgiref (python模块) uwsgi(部署时使用)

    2. 根据路径返回不同的内容

    3. 返回动态的数据(字符串的替换 模板的渲染)

    web的本质就是socket服务端。

    web框架分类

    django 可以实现2 、3功能

    flask 可以实现2 功能

    tornado 可以实现1、2 、3功能

    手写web框架

    socket服务端基础款

     import socket
     ​
     server = socket.socket()
     server.bind(("127.0.0.1",8005))
     server.listen( )
     ​
     while 1:
        conn,addr = server.accept()
        re = conn.recv(1024)
        print(re)
        conn.send(b'HTTP/1.1 200 OK
    
    ok')
        conn.close()

    根据请求的路径返回不同的内容

     import socket
     ​
     server = socket.socket()
     server.bind(("127.0.0.1",8005))
     server.listen( )
     ​
     while 1:
        conn,addr = server.accept()
        re = conn.recv(1024)
        print(re)
        url = re.decode("utf-8").split()[1]
        if url == "/index":
            se = '这里是index'
        elif url == "/home":
            se = '这里是home'
        else:
            se = "这里是默认访问"
        conn.send(b'HTTP/1.1 200 OK
    content-type: text/html; charset=utf-8
    
    ')
        conn.send(se.encode('utf-8'))
     ​
        conn.close()

    函数版

    import socket
     ​
     server = socket.socket()
     server.bind(("127.0.0.1",8005))
     server.listen( )
     ​
     def index(url):
        ret = f'这里是{url}'
        return ret.encode("utf-8")
     def home(url):
        ret = f'这里是{url}'
        return ret.encode("utf-8")
     ​
     ls = [("/index",index),
          ("/home",home)]
     ​
     while 1:
        conn,addr = server.accept()
        re = conn.recv(1024)
        print(re)
        url = re.decode("utf-8").split()[1]
        func = None
        for i in ls:
            if i[0] == url:
                func = i[1]
                break
        if func:
            se = func(url)
        else:
            se = "这里是默认访问".encode("utf-8")
     ​
        conn.send(b'HTTP/1.1 200 OK
    content-type: text/html; charset=utf-8
    
    ')
        conn.send(se)
     ​
        conn.close()

    带html文件版

    import socket
     ​
     server = socket.socket()
     server.bind(("127.0.0.1", 8005))
     server.listen()
     ​
     ​
     def index():
        with open("index.html", mode='rb') as f:
            ret = f.read()
        return ret
     ​
     def home():
        with open("home.html", mode='rb') as f:
            ret = f.read()
        return ret
     ​
     ls = [("/index", index),
          ("/home", home)]
     ​
     while 1:
        conn, addr = server.accept()
        re = conn.recv(1024)
        print(re)
        url = re.decode("utf-8").split()[1]
        func = None
        for i in ls:
            if i[0] == url:
                func = i[1]
                break
        if func:
            se = func()
        else:
            se = "这里是默认访问".encode("utf-8")
     ​
        conn.send(b'HTTP/1.1 200 OK
    content-type: text/html; charset=utf-8
    
    ')
        conn.send(se)
     ​
        conn.close()
    

     

    仅供参考,欢迎指正
  • 相关阅读:
    Shapelib库编译
    CheckedComboBoxEdit实现单选
    VS2019卡在创建Windows恢复点
    ArcGIS Add-In 创建自定义菜单
    使用DevExpress展示地图—加载SHP
    未能从程序集ESRI.ArcGIS.AddIns.SDK加载任务"ValidateAddInXMLTask"
    没有为该对象定义无参数的构造函数
    RichEditControl自定义高亮语法
    Java解析Word模版,替换${}的值
    64.QT-单播、广播、组播
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11426460.html
Copyright © 2020-2023  润新知