首页 > 编程语言 > 详细

python django基础一web框架的本质

时间:2019-02-20 18:29:14      阅读:175      评论:0      收藏:0      [点我收藏+]

web框架的本质就是一个socket服务端,而浏览器就是一个socker客户端,基于请求做出相应,客户端先请求,服务器做出对应响应

按照http协议的请求发送,服务器按照http协议来相应,这样的通信就可以自己实现web框架了

简单web框架

import socket

server = socket.socket()
server.bind((127.0.0.1, 8080))  # 把地址绑到套接字
server.listen()  # 监听链接
while 1:
    conn, addr = server.accept()  # 接受客户端连接
    from_b_msg = conn.recv(1024).decode(utf-8)  # 接收客户端信息
    print(from_b_msg)
    path = from_b_msg.split(\r\n)[0].split()[1]  # 赛选到客户端的第一行信息

    conn.send(bHTTP/1.1 200 ok\r\n\r\n)
    # http响应格式 1.状态行 回车符 换行符  2.相应头部头部字段:值 回车符 换行符 回车符 换行符响应正文

    # conn.send(b‘hello‘)
    if path == /:
        # 只写这一个 你会发现 该 网页css js 应用都没应用上 因为他们 请求/test.css /timg.jpg
        with open(test.html, rb) as f:
            data = f.read()
        conn.send(data)
        conn.close()
    elif path == /test.css:
        with open(test.css, rb) as f:
            data = f.read()
        conn.send(data)
        conn.close()
    elif path == /timg.jpg:
        with open(timg.jpg, rb) as f:
            data = f.read()
        conn.send(data)
        conn.close()
    elif path == /test.js:
        with open(test.js, rb) as f:
            data = f.read()
        conn.send(data)
        conn.close()
    elif path == /meinv.ico:
        with open(meinv.ico, rb) as f:
            data = f.read()
        conn.send(data)
        conn.close()

test.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>Bootstrap 101 Template</title>
    <link rel="stylesheet" href="test.css">
    <link rel="icon" href="meinv.ico">

    <!-- Bootstrap -->
    <!--<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">-->

    <style>

    </style>
</head>
<body>


<h1>来首诗,菩提本无树,明镜亦非台</h1>

<!--<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1550637152712&di=1caeff14731881d6d2ad4d9681ad031a&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F0b55b319ebc4b7454d716709c5fc1e178b8215c3.jpg" >-->
<img src="timg.jpg" alt="">


<!--<script src="jquery.js"></script>-->
<!--<script src="bootstrap/js/bootstrap.min.js"></script>-->
<!--<script>-->

    <!--alert(‘xxx‘);-->

<!--</script>-->
<script src="test.js"></script>

</body>
</html>

test.css

 

h1{
    background-color: green;
}
img{
    width: 200px;
    height: 200px;
}

 

test.js

 

alert(‘xxx‘);

 

这2个图片 我就不提供了

timg.jpg
meinv.ico

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。

工作原理

1.客户端到连接服务器

一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接:如http://www.baidu.com

2.发送http请求

通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

技术分享图片

URL包含:/index/index2?a=1&b=2;路径和参数都在这里。

技术分享图片

3.服务接收请求并返回http响应

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

技术分享图片

技术分享图片

 4.释放连接tcp连接

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

 

5.客户端浏览器解析HTML内容

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

 

只加根判断应答会出现 下面情况

技术分享图片

请求方式: get与post请求(通过form表单我们自己写写看)

  • GET提交的数据会放在URL之后,也就是请求行里面,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456.(请求头里面那个content-type做的这种参数形式,后面讲) POST方法是把提交的数据放在HTTP包的请求体中.
  • GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
  • GET与POST请求在服务端获取请求数据方式不同,就是我们自己在服务端取请求数据的时候的方式不同了,这句废话昂。

http状态码

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

 

高级点的 web框架

from threading import Thread
import socket
server = socket.socket()
server.bind((127.0.0.1, 8080))
server.listen()

def html(conn):
    with open(test.html, rb) as f:
        data = f.read()
    conn.send(data)
    conn.close()

def js(conn):
    with open(test.js, rb) as f:
        data = f.read()

    conn.send(data)
    conn.close()

def css(conn):
    with open(test.css, rb) as f:
        data = f.read()

    conn.send(data)
    conn.close()

def img(conn):
    with open(timg.jpg, rb) as f:
        data = f.read()

    conn.send(data)
    conn.close()

def ico(conn):
    with open(meinv.ico, rb) as f:
        data = f.read()
    conn.send(data)
    conn.close()


url = [
    (/, html),
    (/test.css, css),
    (/timg.jpg, img),
    (/test.js, js),
    (/meinv.ico, ico),
]

while 1:
    conn, addr = server.accept()
    from_b_msg = conn.recv(1024).decode(utf-8)

    path = from_b_msg.split(\r\n)[0].split( )[1]
    conn.send(bHTTP/1.1 200 ok\r\nk1:v1\r\n\r\n)
    for i in url:
        if i[0] == path:
            t=Thread(target=i[1],args=(conn,))
            t.start()

 

python django基础一web框架的本质

原文:https://www.cnblogs.com/zaizai1573/p/10408199.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!