WSGI模版-迭代版本
测试文件夹地址:https://pan.baidu.com/s/1fZi1_6XYH_8fiPimLaM7XQ
还有一种方式是将自己的源码的文档,利用gitbook自动生成,将public文件夹作为源站一样可行。
相关的使用如:利用gitbook搭建自己的私人blog,或者是上传自己的文档书,由于.io有且仅有一个,被自己的blog地址所用,所以挂载的书(原名PythonAdvanced)。
格式如图.
第一版本
- 只有静态的资源,只需要通过获取服务器对应文件目录的资源,并且发送到浏览器端即可.
import socket
import re
import multiprocessing
class WSGIServer(object):
def __init__(self):
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.tcp_server_socket.bind(("", 12800))
self.tcp_server_socket.listen(128)
def service_client(self, new_socket):
# GET / HTTP/1.1
request = new_socket.recv(1024).decode("utf-8")
request_lines = request.splitlines()
print(request_lines)
# splitlines[0]内容为:GET /index.html HTTP/1.1
# [get, post, put, del]四者是通配的.
file_name = ""
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
if ret:
file_name = ret.group(1)
if file_name == "/":
file_name = "/index.html"
# 读取服务器端额数据到浏览器,网站的整个文件保存在html文件夹下.
try:
f = open("./html" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "------file not found-----"
new_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
# 发送的数据包的头文件格式,不合并发送的理由是若文件为单独的一张图片,error.
response = "HTTP/1.1 200 OK\r\n"
response += "\r\n"
# 头文件发送一次.
new_socket.send(response.encode("utf-8"))
# 内容单独发送一次.
new_socket.send(html_content)
new_socket.close()
def run_forever(self):
while True:
# 等待浏览器的链接请求.
new_socket, client_addr = self.tcp_server_socket.accept()
# 多线程服务浏览器的请求.
p = multiprocessing.Process(target=self.service_client, args=(new_socket,))
p.start()
# 多进程需要该行,多线程不需要.
new_socket.close()
# 关闭服务器的监听<==>关闭服务器.
self.tcp_server_socket.close()
def main():
# 主函数,将具体的实现方式模块化.
# 创建对象,or类的实例化<==>,启动服务器.
wsgi_server = WSGIServer()
# 完成浏览器的数据请求.
wsgi_server.run_forever()
if __name__ == "__main__":
main()
第二版本
-
有简单额的数据,可以通过提交请求的后缀名称,判断数据是否是静态的,所以只需要在读取文件之间判断文件的扩展名称,再确定交给哪个处理端进行处理。
-
server端
import socket
import re
import multiprocessing
import time
import mini_frame
class WSGIServer(object):
def __init__(self):
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.tcp_server_socket.bind(("", 10500))
self.tcp_server_socket.listen(128)
def service_client(self, new_socket):
request = new_socket.recv(1024).decode("utf-8")
request_lines = request.splitlines()
print(request_lines)
file_name = ""
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
if ret:
file_name = ret.group(1)
if file_name == "/":
file_name = "/index.html"
if not file_name.endswith(".py"):
try:
f = open("./html" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "------file not found-----"
new_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
response = "HTTP/1.1 200 OK\r\n"
response += "\r\n"
new_socket.send(response.encode("utf-8"))
new_socket.send(html_content)
else:
header = "HTTP/1.1 200 OK\r\n"
header += "\r\n"
body = mini_frame.application(file_name)
response = header+body
new_socket.send(response.encode("utf-8"))
new_socket.close()
def run_forever(self):
while True:
new_socket, client_addr = self.tcp_server_socket.accept()
p = multiprocessing.Process(target=self.service_client, args=(new_socket,))
p.start()
new_socket.close()
self.tcp_server_socket.close()
def main():
wsgi_server = WSGIServer()
wsgi_server.run_forever()
if __name__ == "__main__":
main()
- mini_fram端
import time
def login():
return "i----login--welcome hahahh to our website.......time:%s" % time.ctime()
def register():
return "-----register---welcome hahahh to our website.......time:%s" % time.ctime()
def profile():
return "-----profile----welcome hahahh to our website.......time:%s" % time.ctime()
def application(file_name):
if file_name == "/login.py":
return login()
elif file_name == "/register.py":
return register()
else:
return "not found you page...."
第三版本-WSGI
-
更加复杂的功能,考虑使用WSGI协议,需要遵守的协议,或者叫做数据包的格式.
-
需要注意的是:服务器是服务器,框架是框架,二者不能等同。
- 服务器是只接受请求,发送来自框架的请求
并且
转发至客户浏览器. - 框架负责数据的处理,生成
header or body
.
- 服务器是只接受请求,发送来自框架的请求
# 格式固定,charset=utf-8说明浏览解码格式.
'200 OK', [('Content-Type', 'text/html;charset=utf-8')])
- web-server
import socket
import re
import multiprocessing
import time
import mini_frame
class WSGIServer(object):
def __init__(self):
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM