搭建简易的Web框架
手动搭建
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)
while True:
conn, addr = server.accept()
data = conn.recv(1024)
data = data.decode('utf-8')
conn.send(b'HTTP/1.1\r\n\r\n')
current_path = data.split(' ')[1]
if current_path == '/apple':
conn.send(b'Apple is here!')
elif current_path == '/banana':
conn.send(b'Banana is here!')
elif current_path == '/html':
with open(r'html_file_path', 'rb') as f:
conn.send(f.read())
else:
conn.send(b'404~ sorry~')
conn.close()
基于wsgiref模块搭建
# 基于wsgiref模块,搭建Web框架
from wsgiref.simple_server import make_server
def error(env):
return "404 error"
def tomato(env):
return "tomato"
def apple(env):
return "apple"
def banana(env):
return "banana"
# url与函数的对应关系
urls = [
('/tomato', tomato),
('/apple', apple),
('/banana', banana),
]
def run(env, response):
"""
env:请求相关的所有数据,它将数据处理并封装成字典,让使用者更方便操作
response:响应相关的所有数据
return:返回给浏览器的数据
"""
response('200 OK', []) # 响应首行,响应头
current_path = env.get('PATH_INFO') # 获取用户输入的地址
for url in urls:
if current_path == url[0]:
res = url[1](env)
return [res.encode('utf-8')]
return [error(env).encode('utf-8')]
if __name__ == '__main__':
server = make_server('127.0.0.1', 8080, run)
"""
会实时监听127.0.0.1:8080地址,只要客户端来了
都会交给run函数处理(加括号触发run函数的运行 )
"""
server.serve_forever() # 启动服务端
# 动态网页制作
import datetime
def get_time(env):
current_time = datetime.datetime.now().strftime('%Y-%m-%d %X')
print(current_time)
# 如何将后端的"时间数据"传递给html文件呢?
with open(r'html_file_path', 'r', encoding='utf-8') as f:
data = f.read() # data是一堆字符串(字符串内容:html文件)
data = data.replace('html文件里面的abcdefg', current_time) # 将abcdefg字符替换为时间current_time再发给前端
return data # 当前发送的html文件数据使得网页不再是静态,而是动态的了,
# 因为html文件数据每次都变化,它的数据是实时获取的,或者说,因为部分数据需要实时修改,所有整体数据是实时更新的
# 动态网页进阶
from jinja2 import Template
def get_dict(env):
info_dic = {'username': 'tomato', 'age': 18}
with open('html_file_path','r',encoding='utf-8')as f:
data = f.read()
temp = Template(data) # 将"data数据"转换成Template可处理的数据,并赋值给变量temp
# 调用render功能,查找temp里面的是否有{{user}},有则将info_dic给它,从而更新了数据,将修改完毕的数据赋值给变量res
res = temp.render(user=info_dic)
return res
"""
这时,我们需要在对应的html文件里面,加上{{user}}。
那么,以后这个东西将会被后端"jinja2模块"检测到,并替换对应的数据或功能.
结合上面的代码,可以举个例子,如:
html文件里面写入{{user}} -------------------后端会将它变为---> 'username': 'tomato', 'age': 18
html文件里面写入{{user.get('username')}} ---后端会将它变为---> tomato
"""
Python主流Web框架
Django
基本认识
- Django是一个高级的、全功能的 Web 框架
- 被广泛用于构建复杂而强大的 Web 应用程序
- 它提供了许多内置的功能和工具,如管理员界面、身份验证、数据库ORM等
- 使开发者能够快速构建稳定、可扩展的应用程序
简单概要
- 特点:大而全,自带的功能特别多(即:庞然大物)
- 不足:有时候显得笨重
Flask
基本认识
- Flask 是一个简约而灵活的微型Web框架
- 专注于构建小型或中型的 Web 应用程序和 API
- 相比于 Django,Flask更加轻量级
- 并允许开发者根据需要选择所需的插件和库,以便在项目中进行定制
简单概要
- 特点:自带的功能非常少,但是它第三方的模块超级多
- 不足:比较依赖第三方的开发者,而且兼容性问题不容小觑
Tornado
基本认识
- Tornado 并没有被完全淘汰出三大主流框架之一
- 尽管 Django 和 Flask 是 Python 生态系统中最受欢迎的 Web 框架,但 Tornado 仍然有其独特的优势和用途
- Tornado 是一个高性能的异步Web框架,它以支持并发处理和非阻塞IO操作为目标
- 它经常用于构建高度可扩展且具有实时响应需求的应用程序,例如聊天应用、实时消息传递系统和实时分析工具等
- 由于其出色的性能和强大的异步功能,Tornado 在特定场景下仍然被广泛使用
- 虽然 Django 和 Flask 更加通用、适用于各种类型的 Web 应用程序
- 但 Tornado 的专长在于处理大量并发连接和实时性要求较高的应用
简单概要
- 特点:异步非阻塞,支持高并发(甚至可以开发游戏服务器)
- 不足:它只是一个异步框架,只适合特定场景
Web框架总结
我们从手动搭建web框架中可知,框架主要是下面部分组成
A部分:socket部分
B部分:路由与视图函数对应关系(路由匹配)
C部分:模板语法
django
A部分用的是别人的(wsgiref模块)
B部分用的是自己的
C部分用的是自己的(没有jinja2模块好用,但是也很方便)
flask
A部分用的是别人的(werkzeug,而werkzeug内部还是wsgiref模块)
B部分用的是自己的
C部分用的是别人的(jinja2模块)
tornado
A、B、C部分都是自己写的