文章目录
前言
当你学会了html、css、jQuery、mysql、socket,将这些整合起来就能实现简易的web程序。
一、原生代码简易web框架
一个简易的web程序需要服务端以及客户端。
1.server服务端代码:
import socket
from threading import Thread
from urls import url_list
server1 = socket.socket()
server1.bind(("127.0.0.1", 8080))
server1.listen(5)
def connect_server(server):
while True:
sock, addr = server.accept()
data = sock.recv(1024)
# 将请求相关数据转换为字符串
data_str = data.decode("utf8")
# 向客户端返回状态信息,此处需要发送http协议的头
sock.send(b"HTTP1.1 200 OK\r\n\r\n")
# 获取请求中客户端的请求信息
current_path = data_str.split(' ')[1]
# 根据请求信息返回对应页面
if current_path in url_list:
sock.send(url_list[current_path]())
else:
sock.send(url_list["/error"]())
threads = Thread(target=connect_server, args=(server1,))
threads.start()
2.urls.py 路由
from views import *
url_list = {
"/index":index,
"/login":login,
"/error":error
}
3.views.py 视图
def allot_url(url):
with open(url, "rb") as f:
return f.read()
def index():
return allot_url("index.html")
def login():
return allot_url("login.html")
def error():
return allot_url("error.html")
4.客户端视图
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h1>登录页</h1>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h1>主页</h1>
</body>
</html>
error.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>错误</title>
</head>
<body>
<h1>404</h1>
</body>
</html>
主页预览:
二、wsgiref模块搭建简易web框架
此处只需要将一、中的server修改代码即可
server.py
from wsgiref import simple_server
from urls import url_list
def run(request, response):
"""
:param request: 请求相关的数据
:param response: 响应相关的数据
:return: 返回给客户端的展示数据
"""
# request字典类型的数据(模块自动处理HTTP请求数据 便于后续数据获取)
response('200 OK', []) # 固定编写
# 获取请求中客户端的请求信息
current_path = request.get("PATH_INFO")
# 根据请求信息返回对应页面
if current_path in url_list:
return [url_list[current_path]()] # 必须返回一个可迭代对象
else:
return [url_list["/error"]()] # 必须返回一个可迭代对象
if __name__ == '__main__':
server = simple_server.make_server('127.0.0.1', 8080, run)
'''一致监听本机8080端口 一旦有请求访问 自动触发run方法的执行'''
server.serve_forever()
三、jinja2模块实现动态页面
jinja2为第三方模块需要下载:
pip install jinja2
首先在views添加对应的方法:
def user():
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='root',
db='sqlexam',
charset='utf8'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'select * from student'
cursor.execute(sql)
data_list = cursor.fetchall() # 获取sql查询结果
with open("user.html", "r", encoding="utf8") as f:
data = f.read()
temp_obj = Template(data)
res = temp_obj.render({"data_list": data_list})
return res.encode("utf8")
user.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户表</title>
</head>
<body>
<table>
<thead>
<tr>
<th>学号</th>
<th>性别</th>
<th>班级号</th>
<th>姓名</th>
</tr>
</thead>
<tbody>
{% for data in data_list %}
<tr>
<th>data.sid</th>
<th>data.gender</th>
<th>data.class_id</th>
<th>data.sname</th>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
可以实现动态页面
四、 框架请求流程
urls.py
后缀与函数名对应关系
(‘/index’,register)
后缀专业名词称之为’路由’
函数名专业名词称之为’视图函数’
urls.py专业名词称之为’路由层’
views.py
专门编写业务逻辑代码
可以是函数 也可以是类
函数专业名词称之为’视图函数’
类专业名词称之为’视图类’
views.py专业名词称之为’视图层’
templates文件夹
专门存储html文件
html文件专业名词称之为’模板文件’
templates文件夹专业名词称之为’模板层’
五、python主流web框架
django:
大而全 自带的功能非常的多 但是有时候会略显笨重
类似于’航空母舰’
flask:
小而精 自带的功能非常的少 但是第三方模块非常的多
类似于’游骑兵’
flask的第三方模块加到一起甚至比django还多 并且也越来越像django
flask由于过多的依赖于第三方模块 有时候也会受制于第三方模块
tornado:
异步非阻塞框架 速度极快 甚至可以用于充当游戏服务器
还有一些占比较小 但是也很厉害的框架
fastapi、sanic…