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()
- 服务器启动:服务器在本地的8080端口上监听连接请求。
- 接收请求:服务器接受客户端的连接,并接收客户端发送的数据。
- 解析请求:打印接收到的数据,这些数据包括请求行、请求头等信息。
- 构建响应:服务器构建一个HTTP响应,包括响应行、响应头和空行。
- 发送响应:服务器发送响应行、响应头和响应体给客户端。
- 关闭连接:服务器在发送完响应后关闭与客户端的连接。
多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()
说明
- 路由字典:定义一个字典
url_dict
,将URL路径映射到对应的处理函数。 - 解析URL:从接收到的请求数据中解析出URL路径。
- 调用处理函数:根据URL路径调用对应的处理函数,并发送相应的响应。
- 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框架,这部分会比较的困难,因为这是一个比较大型的项目了,希望大家可以多多支持。