这次的内容有点多= =(刚学完的时候一脸懵逼…)
框架的作用,主要就是处理浏览器和服务器之间的HTTP协议请求的。
- 如果是静态请求的话,由服务器自行调用静态的页面。
之前有写到过:调用静态页面的相关内容 - 如果是动态请求的话,就交给框架来处理。
1.不分离框架开发:你需要会一点前端的代码,起码需要知道你在哪插入数据,还有插入数据的标签格式.
2.分离开发:你只需要管你后端怎么查数据怎么处理数据就好,做好你的事(ji),其他的事情不需要你操心…查询完数据之后把你的数据转换成JSON的数据格式等着前端页面的ajax请求就行
不分离开发流程
- 创建路由列表,写好装饰器.装饰器中自动添加路由
- 写好每一个需要调用的页面函数
- 在处理函数之中判断传来的路径,和路由表中的路径匹配的话就调用相应的页面函数,返回需要的HTTP协议的行,头,体balabala的。当然没找到的话当然是404。
分离开发流程
- 只管搞数据就行了,我例子之中使用了两个页面函数一起实现的,center()函数是实现一个只有样式的页面,center_data()函数是实现具体的数据。
- 当用户访问到center页面时,center函数行动了,返回了一个空页面,但是前端在你返回的空页面模板里面写了ajax异步请求,就是模板center页面,请求你center_data里面的数据。
- center_data里面首先取数据库的数据出来,然后做成JSON的数据格式,你有请求我就发数据给你,不需要考虑什么位置和格式,因为全部都是json数据。格式位置都是前端需要考虑的事情。
主页面代码:
import socket
import threading
from 一阶段4 import homework_flask
from 一阶段4 import flask
创建服务器类,在构造方法完成服务器创建四步骤
class HttpWebServer(object):
def init(self):
# 创建tcp服务端套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口号复用, 程序退出端口立即释放
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口号
tcp_server_socket.bind(("", 9090))
# 设置监听
tcp_server_socket.listen(128)
# 保存创建成功的服务器套接字
self.tcp_server_socket = tcp_server_socket
#
# # 处理客户端的请求
@staticmethod
def handle_client_request(new_socket):
# 代码执行到此,说明连接建立成功
recv_client_data = new_socket.recv(4096)
if len(recv_client_data) == 0:
print("关闭浏览器了")
new_socket.close()
return
# 对二进制数据进行解码
recv_client_content = recv_client_data.decode("utf-8")
print(recv_client_content)
# 根据指定字符串进行分割, 最大分割次数指定2
request_list = recv_client_content.split(" ", maxsplit=2)
# 获取请求资源路径
request_path = request_list[1]
print(request_path)
# 判断请求的是否是根目录,如果条件成立,指定首页数据返回
if request_path == "/":
request_path = "/index.html"
# 判断请求的路径是否是动态的
if request_path.endswith(".html"):
env = {
'request_path': request_path
}
# handle_request()将函数返回的结果进行拆包,得到响应行
status, head, response_body = homework_flask.handle_request(env)
response_line = status
response_header = ''
# 遍历得到的头部,拼接成HTTP中的头部
for header in head:
response_header += "%s: %s\r\n" % header
# 响应报文的拼接:响应行+ 响应头 + 空行 + 响应体
response_data = (response_line + response_header + '\r\n' + response_body).encode('utf8')
new_socket.send(response_data)
new_socket.close()
# 如果不是.html后缀的文件则判断为静态资源,就执行静态资源获取
else:
try:
# 动态打开指定文件
with open("static" + request_path, "rb") as file:
# 读取文件数据
file_data = file.read()
except Exception as e:
# 请求资源不存在,返回404数据
# 响应行
response_line = "HTTP/1.1 404 Not Found\r\n"
# 响应头
response_header = "Server: PWS1.0\r\n"
with open("static/error.html", "rb") as file:
file_data = file.read()
# 响应体
response_body = file_data
# 拼接响应报文
response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
# 发送数据
new_socket.send(response_data)
else:
# 响应行
response_line = "HTTP/1.1 200 OK\r\n"
# 响应头
response_header = "Server: PWS1.0\r\n"
# 响应体
response_body = file_data
# 拼接响应报文
response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
# 发送数据
new_socket.send(response_data)
finally:
# 关闭服务与客户端的套接字
new_socket.close()
# 启动web服务器进行工作
def start(self):
while True:
# 等待接受客户端的连接请求
new_socket, ip_port = self.tcp_server_socket.accept()
# 当客户端和服务器建立连接程,创建子线程
sub_thread = threading.Thread(target=self.handle_client_request, args=(new_socket,))
# 设置守护主线程
sub_thread.setDaemon(True)
# 启动子线程执行对应的任务
sub_thread.start()
程序入口函数
def main():
# 创建web服务器对象
web_server = HttpWebServer()
# 启动web服务器进行工作
web_server.start()
if name == ‘main’:
main()
homework_flask 页面代码
import json
import time
import pymysql
import json
创建路由列表,在页面家在完成的时候,@route(url)这个带参数的闭包装饰器就会把所有使用装饰的函数路径添加到这个列表,然后在handle_request函数中实现访问
route_list = []
def route(url):
“”“带参数的装饰器”""
def fun_out(fn):
# 将路径和函数名按字典格式存入路由表
route_list.append({url,fn})
def fun_in(*args, **kwargs):
print("不会执行的fun")
result = fn(*args, **kwargs)
return result
return fun_in
return fun_out
@route(’/index.html’)
def index():
“”“将数据库的数据查询出来显示在浏览器”""
# 状态
status = ‘HTTP/1.1 200 OK’
# 头部
head = [(‘GzxServer’, ‘czf1.0’)]
# 取数据
conn = pymysql.connect(host=‘192.168.11.69’, port=3306, user=‘root’, password=‘mysql’, database=‘stock_db’, charset=‘utf8’)
cur = conn.cursor()
sql = ‘select * from info;’
cur.execute(sql)
# 将取到的所有数据放在info_data,后面放到网页中
info_data = cur.fetchall()
print(info_data)
data = ''
# 打开模板页,读出数据,存入data中,把模板页中的可变量{%content%}替换成你想要的数据
with open("template/index.html",'r',encoding='utf8') as file:
file_data = file.read()
for info in info_data:
# 格式从模板页面里面复制,嘻嘻
data += '''<tr>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td><input type="button" value="添加" id="toAdd" name="toAdd" systemidvaule="000007"></td>
</tr>''' % info
result_data = file_data.replace('{%content%}', data)
# 返回所有HTTP需要的拼接字段
return status, head, result_data
@route(’/center.html’)
def center():
“”“返回一个个人页面的样式,无数据”""
# 状态
status = ‘HTTP/1.1 200 OK’
# 头部
head = [(‘GzxServer’, ‘czf1.0’)]
data = ''
with open('template/center.html','r')as file:
file_data = file.read()
# {%content%}就是后面可变的数据,可替换成自己的
result_data = file_data.replace('{%content%}',data)
return status, head, result_data
@route(’/center_data.html’)
def center_data():
“”“个人数据的接口”""
status = ‘HTTP/1.1 200 OK’
head = [(‘GzxServer’, ‘czf1.0’),(“Content-Type”, “text/html;charset=utf-8”)]
data = ‘’
conn = pymysql.connect(host=‘192.168.11.69’, port=3306, user=‘root’, password=‘mysql’, database=‘stock_db’,
charset=‘utf8’)
cur = conn.cursor()
sql = ‘select i.code,i.short,i.chg,i.turnover,i.price,i.highs,f.note_info from info i inner join focus f where f.info_id=i.id;’
cur.execute(sql)
info_data = cur.fetchall()
cur.close()
conn.close()
# 定义一个空列表,存json的数据
info_list = list()
for info in info_data:
# 定义一个空字典,存数据,注意只能存字符串
info_dict = dict()
info_dict[“code”] = info[0]
info_dict[“short”] = info[1]
info_dict[“chg”] = info[2]
info_dict[“turnover”] = info[3]
info_dict[“price”] = str(info[4])
info_dict[“highs”] = str(info[5])
info_dict[“note_info”] = info[6]
info_list.append(info_dict)
# 转换成json的数据格式
info_json = json.dumps(info_list,ensure_ascii=False)
return status,head,info_json
@route(’/error.html’)
def error():
“”“找不到页面的时候跳转的页面”""
# 状态
status = ‘HTTP/1.1 404 NotFound’
# 头部
head = [(‘GzxServer’, ‘czf1.0’)]
with open('static/error.html','r')as file:
data = file.read()
return status, head, data
def handle_request(env):
# 获取路径
request_path = env[“request_path”]
# 从路由表中取路径和函数判断然后执行
for path, func in route_list:
if path == request_path:
result = func()
return result
# 404页面你懂的
else:
result = error()
return result
index页面模板代码:
<div class="container-fluid">
<table class="table table-hover">
<tr>
<th>序号</th>
<th>股票代码</th>
<th>股票简称</th>
<th>涨跌幅</th>
<th>换手率</th>
<th>最新价(元)</th>
<th>前期高点</th>
<th>前期高点日期</th>
<th>添加自选</th>
</tr>
{%content%}
</table>
</div>
center模板页面代码
<div class="container-fluid">
<table class="table table-hover">
<tr>
<th>股票代码</th>
<th>股票简称</th>
<th>涨跌幅</th>
<th>换手率</th>
<th>最新价(元)</th>
<th>前期高点</th>
<th style="color:red">备注信息</th>
<th>修改备注</th>
<th>del</th>
</tr>
{%content%}
</table>
</div>