当前位置: 首页 > article >正文

web框架

1. Web框架:

1.1Web框架定义


Web框架是一个用于构建Web应用程序的软件框架,它提供了一套完整的开发工具和库,以简化Web应用的开发过程。Web框架通常实现了HTTP协议、路由机制、模板渲染、数据验证、数据库操作等常用功能。

1.2Web框架与数据传输协议


Web框架在底层通常会处理TCP/IP协议和HTTP协议等数据传输协议。当用户通过浏览器访问Web应用时,浏览器会向服务器发送HTTP请求,而Web框架则负责接收这些请求,并返回相应的HTTP响应。

1.3Web框架与网络操作


Web框架还涉及网络操作,如监听端口、处理并发连接、管理会话等。框架通常提供了这些功能的抽象接口,使得开发者无需关注底层的网络编程细节。

1.4Web框架的本质


所有的Web框架在本质上都是一个socket服务端。这是因为HTTP协议是基于TCP/IP协议的,而TCP/IP协议又是通过socket进行通信的。因此,Web框架在底层都是使用socket来监听端口、接收和发送数据的。

1.5浏览器作为socket客户端


当用户通过浏览器访问Web应用时,浏览器实际上扮演了一个socket客户端的角色。浏览器会向Web服务器发送HTTP请求(即socket数据),并接收服务器返回的HTTP响应(同样是socket数据)。

2. 软件架构

2.1C/S架构(Client/Server)

2.1.1定义

C/S架构是一种软件架构模式,其中应用程序被划分为客户端(Client)和服务器(Server)两部分。客户端负责与用户进行交互,并向服务器发送请求;服务器则负责处理这些请求,并返回相应的结果

2.1.2特点

  • 需要安装客户端应用程序:用户在访问前需要先安装对应的客户端应用程序。
  • 响应速度快:由于客户端和服务器之间的通信通常是在局域网内进行的,因此响应速度通常较快。
  • 安全性较高:由于客户端和服务器之间的通信是私有的,因此可以实施更严格的安全策略。

 2.2B/S架构(Browser/Server)

2.2.1定义

B/S架构是一种基于Web的软件架构模式,也称为Web架构。在这种架构中,用户通过Web浏览器(如Chrome、Firefox等)访问Web应用,而Web应用则运行在服务器上。

2.2.2特点

  • 无需安装客户端应用程序:用户只需通过浏览器即可访问Web应用,无需安装额外的客户端软件。
  • 跨平台性:由于浏览器是跨平台的,因此B/S架构的Web应用也具有很好的跨平台性。
  • 可维护性高:由于Web应用的代码都运行在服务器上,因此可以集中管理和维护。
  • 安全性挑战:由于Web应用是通过Internet进行访问的,因此面临着更多的安全威胁和挑战。

3.基于Socket实现的简单Web框架

import socket

# 创建socket对象
server = socket.socket()

# 绑定IP地址和端口号
server.bind(('127.0.0.1', 8080))

# 开始监听连接请求
server.listen(5)
print("服务器启动,等待连接...")

while True:
    # 接受客户端连接
    sock, address = server.accept()
    print(f"连接来自:{address}")

    # 接收客户端发送的数据
    data = sock.recv(1024)
    print("接收到的数据:", data.decode('utf-8'))

    '''
    HTTP请求报文结构:
    1. 请求行:包含请求方法,请求地址,HTTP协议版本(如HTTP/1.1)
    2. 请求头:包含请求的附加信息,以键值对形式传输
    3. 空行:请求头和请求体之间的分隔符
    4. 请求体:包含发送给服务器的数据(如POST请求的数据)
    '''

    '''
   响应报文结构:
    1. 响应行:包含HTTP协议版本,响应状态码(如200),响应状态描述(如OK)
    2. 响应头:包含响应的附加信息,以键值对形式传输
    3. 空行:响应头和响应体之间的分隔符
    4. 响应体:服务器返回给客户端的数据
    '''

    # 构建HTTP响应
    response = 'HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n'
    sock.send(response.encode('utf-8'))

    # 发送响应体
    sock.send(b'hello')
    sock.send("阿宸好帅".encode('gbk'))

    # 关闭连接
    sock.close()
  1. 服务器启动:服务器在本地的8080端口上监听连接请求。
  2. 接收请求:服务器接受客户端的连接,并接收客户端发送的数据。
  3. 解析请求:打印接收到的数据,这些数据包括请求行、请求头等信息。
  4. 构建响应:服务器构建一个HTTP响应,包括响应行、响应头和空行。
  5. 发送响应:服务器发送响应行、响应头和响应体给客户端。
  6. 关闭连接:服务器在发送完响应后关闭与客户端的连接。

多URL访问支持

为了支持多个URL路径,可以扩展上述代码,将URL路径映射到不同的处理函数:

import socket

# 创建socket对象
server = socket.socket()

# 绑定IP地址和端口号
server.bind(('127.0.0.1', 8080))

# 开始监听连接请求
server.listen(5)
print("服务器启动,等待连接...")

# 定义路由和对应的处理函数
def index():
    return bytes('Welcome to the index page!', encoding='utf-8')

def num():
    return bytes('This is the num page.', encoding='utf-8')

# URL路由字典
url_dict = {
    '/index': index,
    '/num': num,
}

while True:
    # 接受客户端连接
    sock, address = server.accept()
    print(f"连接来自:{address}")

    # 接收客户端发送的数据
    data = sock.recv(1024).decode('utf-8')
    print("接收到的请求:", data)

    # 解析请求的URL
    url = data.split(' ')[1]

    # 构建HTTP响应
    response = 'HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n'

    # 根据URL调用对应的处理函数
    if url in url_dict:
        func = url_dict[url]()
        sock.send(response.encode('utf-8') + func)
    else:
        sock.send(response.encode('utf-8') + b'404 Not Found')

    # 关闭连接
    sock.close()

说明

  1. 路由字典:定义一个字典url_dict,将URL路径映射到对应的处理函数。
  2. 解析URL:从接收到的请求数据中解析出URL路径。
  3. 调用处理函数:根据URL路径调用对应的处理函数,并发送相应的响应。
  4. 404处理:如果请求的URL路径不存在于路由字典中,则返回404错误。

 4、基于 wsgiref 模块

WSGI是python web 应用程序与 web 服务器之间的一种通用标准接口,即 WSGI 是一个规范标准。它定义了如何让 web 服务器与 python 程序进行交互。可以在不同的服务器环境下,不需要修改代码也可以运行同一份 python web项目。

wsgiref 模块中封装了 socket  的服务端操作,处理数据请求和响应的协议

Django 的开发环境就是需要用到这个模块来作为服务器。

以下是代码实例:

from wsgiref.simple_server import make_server  
  
def handle_index():  
    """处理并返回index页面的内容,使用UTF-8编码以确保兼容性。"""  
    return bytes('欢迎访问index页面', encoding='utf-8')  
  
def handle_num():  
    """处理并返回num页面的内容,同样使用UTF-8编码。"""  
    return bytes('这是num页面的内容', encoding='utf-8')  
  
# URL路由映射,将URL路径映射到对应的处理函数  
url_routes = {  
    b'/index': handle_index,  
    b'/num': handle_num,  
}  
  
def application(environ, start_response):  
    """  
    WSGI应用程序的入口点。  
  
    Args:  
        environ (dict): 包含请求信息的字典,由WSGI服务器提供。  
        start_response (callable): 一个函数,用于发送HTTP响应的状态码和头部信息。  
  
    Returns:  
        list of bytes: 响应体的迭代器,这里直接返回一个包含响应体的列表。  
    """  
    # 从请求环境中获取URL路径,并转换为字节串  
    path_info = environ.get(b'PATH_INFO', b'/').decode('utf-8').encode('utf-8')  
  
    # 设置HTTP响应的状态码和头部信息  
    status = '200 OK'  
    headers = [('Content-Type', 'text/plain; charset=utf-8')]  
    start_response(status, headers)  
  
    # 根据URL路径查找对应的处理函数  
    handler = url_routes.get(path_info, lambda: bytes('404 Not Found', encoding='utf-8'))  
  
    # 调用处理函数获取响应体,并返回  
    return [handler()]  
  
if __name__ == '__main__':  
    # 创建一个WSGI服务器实例,绑定到本地主机的8989端口,并指定WSGI应用程序  
    httpd = make_server('127.0.0.1', 8989, application)  
    print("WSGI服务器正在运行,访问地址:http://127.0.0.1:8989")  
    # 启动服务器并等待连接  
    httpd.serve_forever()

结语:

好了今天关于web框架的文章就先分享到这里了,接下来我们将会继续学习Django框架,这部分会比较的困难,因为这是一个比较大型的项目了,希望大家可以多多支持。


http://www.kler.cn/a/301289.html

相关文章:

  • 【LeetCode 题】只出现一次的数字--其余数字都出现3次
  • Linux Kernel Programming 2
  • 三维测量与建模笔记 - 点特征提取 - 4.3 Harris特征点
  • 基于多模板配准的心腔分割算法
  • .NET 简介
  • VMware 中 虚拟机【Linux系统】固定 ip 访问
  • 【linux】一种基于虚拟串口的方式使两个应用通讯
  • 使用kubeadm手动安装K8s
  • C++学习笔记----6、内存管理(五)---- 智能指针(4)
  • 使用patch命令移除sts中的一个container
  • 【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+JPEG图片马)
  • 力扣100题——动态规划
  • 【MATLAB】数据和字符串类型转换
  • 路由器出现DNS(Domain Name System)没有被解析的情况,没有被解析的情况,通常是由多种原因导致的。以下是一些可能的原因及相应的解释:
  • TDSQL:腾讯分布式数据库系统的核心要点与优势分析
  • Java之枚举
  • macos 系统文件操作时提示 Operation not permitted 异常解决方法 , 通过恢复模式 开启 /关闭 SIP方法
  • debian12实践-安装docker
  • 日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
  • Redisson实现订单到期关闭
  • 论文阅读_检索增强生成 RAG 综述
  • 架构模式:MVC
  • harbor目录结构和镜像存储机制是什么
  • (详细文档)javaswing学生成绩管理系统(mysql)+详细报告
  • 汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推
  • 【预训练语言模型】BERT原理解析、常见问题