• 【web框架】——Django——如桃花来


    web框架介绍:

    • web框架就是一个骨架和开发的一系列工具的集合。我们只需要通过一些工具稍作修饰即可完成一个作品。方便web开发 , 不需要一直做一些重复性的操作。相当于一个半成品
    • web框架的存在可以减少应用开发的周期 , 提高效率与质量 ; 降低维护成本。
    • 所有的web框架的本质就是一个socket服务端;用户通过浏览器进行数据访问,浏览器就充当了socket客户端。

    常见软件的架构:

    CS架构:

    CS:(Clinet & Server) 服务端和客户端的架构,这个架构是从用户层面进行划分的,通过这个架构开发出来的东西对用户的系统环境依赖比较大。
    (微信 , 抖音 , QQ , pycharm……),一般都需要进行下载。

    BS架构:

    BS:(Browser & Server) 浏览器和服务端架构 , 这个模式下用户只需要通过浏览器发送http协议请求就可以获取到对应的资源.(百度 ,博客园 , 力扣 , CSDN , B站…… ),一般可以通过浏览器在线访问。

    BS的本质也是CS架构 , BS中浏览器充当了客户端。
    
    • 1

    网络通信:

    socket知识复习:

    服务端代码逻辑:

    socket服务端:

    1. 创建socket对象
    2. 绑定IP和端口号(1024-65535)
    3. 设置监听,最大连接数
    4. 创立对等连接套接字
    5. 等待客户端的连接
    6. 数据的接收与发送
    7. 关闭

    客户端代码逻辑:

    socket客户端:

    1. 创建socket对象
    2. 连接服务端的IP和端口号
    3. 数据的接收与发送
    4. 关闭

    socket代码演示:

    服务端代码演示:

    import socket
    
    server = socket.socket() #默认是TCP协议
    server.bind(("127.0.0.1",8098)) #以元组形式传入,绑定端口号和IP
    server.listen(5)
    
    while True:
    	conn,addr = server.accept() #创立对等连接套接字
    	print(conn) #,这是连接对象,接收和发送数据用连接对象
    	print(addr) #('127.0.0.1', 53894)
    	data = conn.recv(1024)
    	print(data.decode('utf-8'))
    	conn.send(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    客户端代码演示:

    import socket
    
    client = socket.socket()
    client.connect(("127.0.0.1",8098))
    
    while True:
    	message = input("请输入你给客户端发送的信息:")
    	if not message:continue #如果数据为空,则不发送。这一代码是避免发送空数据过去
    	if message == "q":break #手动输入q结束
    	client.send(message.encode("utf-8"))
    	data = client.recv(1024)
    	print(data.decode("utf-8"))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    tips: 我可以通过这种方式在不同电脑上进行数据传输么?

    在其他电脑上写一个socket写一个客户端 , 访问我的服务端。(前提两台电脑必须是在同一个局域网中。)

    手写框架:

    基于socket实现框架:

    我们把127.0.0.1:8099输入浏览器进行访问

    import socket
    server = socket.socket() #默认是TCP协议
    server.bind(("127.0.0.1",8089))
    server.listen(10) #设置监听
    
    while True:
    	conn,addr = server.accept()
    	data = conn.recv(1024).decode("utf-8")
    	print(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    响应无效,不等于访问数据失败。

    课程一小时处

    改良版:

    import socket
    
    server = socket.socket()  # 默认是TCP协议
    server.bind(('127.0.0.1', 8098))
    server.listen(5)
    
    # 把不同的url响应的数据封装成函数
    def index(url):
        return bytes(f'我是{url}响应的页面数据' , encoding='gbk')
    
    def ac(url):
        return bytes('我好帅', encoding='gbk')
    
    # 可以把url以及对应功能函数用字典进行对应关系
    url_dict = {
        '/index/':index,
        '/ac/':ac
    }
    
    while True:
        sock, address = server.accept()
        data = sock.recv(1024).decode('utf-8')
        # 浏览器发送的http协议请求
        print(data)
        url = data.split(' ')[1]
        # 以http协议发送响应数据 , 前提就是先发送一个http协议
        sock.send(b'HTTP1.1 200 OK \r\n\r\n')
        # 定义一个变量作为程序的标志
        msg = 1
        # 循环遍历url对应关系的字典
        for i in url_dict:
            # 判断获取到的数据是否等于请求的url
            if i == url:
                # 代用url对应的功能函数
                func = url_dict[i](url)
                sock.send(func)
                msg = 0
        # 判断是否有对应url响应数据
        if msg :
            sock.send('404 not found'.encode('utf-8'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    基于wsgiref实现框架:

    • 在web开发中程序一般会分为两个部分
    • 服务器程序:负责对socke服务器进行封装,处理请求的
    • 应用程序:负责具体的逻辑处理 , 具体做事的。
    • WSGI:是一个规范化接口,定义了Web服务器如何与python应用程序进行交互。里面把所有的http请求和解析http请求协议进行包装。
    • 在python标准库中 , 提供了WSGI的服务器模块 wsgiref , wsgiref里面封装了socket代码,Django底层也是使用这个模块进行socket的操作
    from wsgiref.simple_server import make_server
    
    # 把不同的url响应的数据封装成函数
    def index(url):
        return bytes(f'我是{url}响应的页面数据' , encoding='gbk')
    
    def ac(url):
        return bytes('阿宸好帅', encoding='gbk')
    
    # 可以把url以及对应功能函数用字典进行对应关系
    url_dict = {
        '/index/':index,
        '/ac/':ac
    }
    
    # 响应函数
    def run(environ , response):
        '''
        :param environ: 接收的是请求相关的所有数据 , wsgiref模块将http请求封装成字典类型的数据
        :param response:响应数据 , 是一个函数
        :return: 返回客户端的数据 , 以列表的形式返回
        '''
        # 响应数据 , 传入响应状态码 , 响应头
        response('200 OK' , [])
        # 获取请求的url
        url = environ['PATH_INFO']
        # 定义一个变量作为程序的标志
        msg = 1
        # 循环遍历url对应关系的字典
        for i in url_dict:
            # 判断获取到的数据是否等于请求的url
            if i == url:
                # 代用url对应的功能函数
                response_data = url_dict[i](url)
                msg = 0
        # 判断是否有对应url响应数据
        if msg:
            response_data = b'404 not found'
        # 将获取到的数据响应到浏览器中
        return [response_data]
    
    if __name__ == '__main__':
        # 实例化 , 创建服务端对象 , 实时监听请求
        client = make_server('127.0.0.1',10086 , run)
        # 启动服务端
        client.serve_forever()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    静态页面数据响应:

    from wsgiref.simple_server import make_server
    
    # 把不同的url响应的数据封装成函数
    def index(url):
        # 服务器响应前端页面
        with open('index.html' , 'r' , encoding='utf-8') as f:
            data = f.read()
        # 讲读取出来的页面数据进行返回给浏览器
        return bytes(data.encode('utf-8'))
    
    def ac(url):
        return bytes('阿宸好帅', encoding='gbk')
    
    # 可以把url以及对应功能函数用字典进行对应关系
    url_dict = {
        '/index/':index,
        '/ac/':ac
    }
    
    # 响应函数
    def run(environ , response):
        '''
        :param environ: 接收的是请求相关的所有数据 , wsgiref模块将http请求封装成字典类型的数据
        :param response:响应数据 , 是一个函数
        :return: 返回客户端的数据 , 以列表的形式返回
        '''
        # 响应数据 , 传入响应状态码 , 响应头
        response('200 OK' , [])
        # 获取请求的url
        url = environ['PATH_INFO']
        # 定义一个变量作为程序的标志
        msg = 1
        # 循环遍历url对应关系的字典
        for i in url_dict:
            # 判断获取到的数据是否等于请求的url
            if i == url:
                # 代用url对应的功能函数
                response_data = url_dict[i](url)
                msg = 0
        # 判断是否有对应url响应数据
        if msg:
            response_data = b'404 not found'
        # 将获取到的数据响应到浏览器中
        return [response_data]
    
    if __name__ == '__main__':
        # 实例化 , 创建服务端对象 , 实时监听请求
        client = make_server('127.0.0.1',10086 , run)
        # 启动服务端
        client.serve_forever()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
  • 相关阅读:
    从零带你底层实现unordered_map (1)
    一文读懂js中的原型链以及new操作符
    Prometheus AlertManager 生产实践-直接根据 to_email label 发 alert 到对应邮箱
    “入职 半 年,那个高薪挖来的自动化测试工程师被劝退了。”
    ARP协议,ARP攻击和ARP欺骗
    C++ STL --- vector类模拟实现
    NeurIPS2022 interesting papers
    C/C++面试常见知识点
    Node.js 初学者教程
    Java中在控制台读取字符
  • 原文地址:https://blog.csdn.net/2301_76312306/article/details/130827685