(资料图)
Python动态服务器网页(需要使用WSGI接口),基本实现步骤如下:1.等待客户端的链接,服务器会收到一个http协议的请求数据报2.利用正则表达式对这个请求数据报进行解析(请求方式、提取出文件的环境)3.提取出文件的环境之后,利用截断取片的方法将文件名转化为模块名称4.使用m = __import__()
,就可以得到返回值为m的模块5.创建一个env字典:其中包含的是请求方式及文件环境等各种的键值对6.创建一个新的动态脚本,其中定义了application这个函数,必须包含env和start_response的参数(也是服务器里的调用方法)7.在这个动态脚本中定义状态码status和响应头headers(注意是字典形式,如Content-Type)8.然后再调用start_response(status,headers),但是要注意,这个函数在服务器被定义9.在动态脚本中编写动态执行程序10.m.appliction的返回值就是回应数据包的body,它的数据头在start_response被整合11.将数据头与数据body拼接起来,然后发送给客户端,就可显示动态网页
MyWebServer
import socketimport reimport sys from multiprocessing import Processfrom MyWebFramework import Application # 设置静态文件根目录HTML_ROOT_DIR = "./html"WSGI_PYTHON_DIR = "./wsgipython" class HTTPServer(object): """""" def __init__(self, application): """构造函数, application指的是框架的app""" self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.app = application def start(self): self.server_socket.listen(128) while True: client_socket, client_address = self.server_socket.accept() #print("[%s,%s]用户连接上了" % (client_address[0],client_address[1])) print("[%s, %s]用户连接上了" % client_address) handle_client_process = Process(target=self.handle_client, args=(client_socket,)) handle_client_process.start() client_socket.close() def start_response(self, status, headers): """ status = "200 OK" headers = [ ("Content-Type", "text/plain") ] star """ response_headers = "HTTP/1.1 " + status + "\r\n" for header in headers: response_headers += "%s: %s\r\n" % header self.response_headers = response_headers def handle_client(self, client_socket): """处理客户端请求""" # 获取客户端请求数据 request_data = client_socket.recv(1024) print("request data:", request_data) request_lines = request_data.splitlines() for line in request_lines: print(line) # 解析请求报文 # "GET / HTTP/1.1" request_start_line = request_lines[0] # 提取用户请求的文件名 print("*" * 10) print(request_start_line.decode("utf-8")) file_name = re.match(r"\w+ +(/[^ ]*) ", request_start_line.decode("utf-8")).group(1) method = re.match(r"(\w+) +/[^ ]* ", request_start_line.decode("utf-8")).group(1) env = { "PATH_INFO": file_name, "METHOD": method } response_body = self.app(env, self.start_response) response = self.response_headers + "\r\n" + response_body # 向客户端返回响应数据 client_socket.send(bytes(response, "utf-8")) # 关闭客户端连接 client_socket.close() def bind(self, port): self.server_socket.bind(("", port)) def main(): sys.path.insert(1, WSGI_PYTHON_DIR) if len(sys.argv) < 2: sys.exit("python MyWebServer.py Module:app") # python MyWebServer.py MyWebFrameWork:app module_name, app_name = sys.argv[1].split(":") # module_name = "MyWebFrameWork" # app_name = "app" m = __import__(module_name) app = getattr(m, app_name) http_server = HTTPServer(app) # http_server.set_port http_server.bind(8000) http_server.start() if __name__ == "__main__": main()
MyWebFrameWork
import time# from MyWebServer import HTTPServer # 设置静态文件根目录HTML_ROOT_DIR = "./html" class Application(object): """框架的核心部分,也就是框架的主题程序,框架是通用的""" def __init__(self, urls): # 设置路由信息 self.urls = urls def __call__(self, env, start_response): path = env.get("PATH_INFO", "/") # /static/index.html if path.startswith("/static"): # 要访问静态文件 file_name = path[7:] # 打开文件,读取内容 try: file = open(HTML_ROOT_DIR + file_name, "rb") except IOError: # 代表未找到路由信息,404错误 status = "404 Not Found" headers = [] start_response(status, headers) return "not found" else: file_data = file.read() file.close() status = "200 OK" headers = [] start_response(status, headers) return file_data.decode("utf-8") for url, handler in self.urls: #("/ctime", show_ctime) if path == url: return handler(env, start_response) # 代表未找到路由信息,404错误 status = "404 Not Found" headers = [] start_response(status, headers) return "not found" def show_ctime(env, start_response): status = "200 OK" headers = [ ("Content-Type", "text/plain") ] start_response(status, headers) return time.ctime() def say_hello(env, start_response): status = "200 OK" headers = [ ("Content-Type", "text/plain") ] start_response(status, headers) return "hello itcast" def say_haha(env, start_response): status = "200 OK" headers = [ ("Content-Type", "text/plain") ] start_response(status, headers) return "hello haha" urls = [ ("/", show_ctime), ("/ctime", show_ctime), ("/sayhello", say_hello), ("/sayhaha", say_haha), ]app = Application(urls)# if __name__ == "__main__":# urls = [# ("/", show_ctime),# ("/ctime", show_ctime),# ("/sayhello", say_hello),# ("/sayhaha", say_haha),# ]# app = Application(urls)# http_server = HTTPServer(app)# http_server.bind(8000)# http_server.start()
Python动态服务器网页(需要使用WSGI接口),基本实现步骤如下:1 等待客户端的链接,服务器会收到一个...
主要指标需求1-3月商品房销售面积同比降幅收窄至1 8%,销售额同比增长4 1%,其中住宅修复较快,带动全...
今日pd990钯金多少钱一克回收价格(2023年04月18日)每日更新
1、「拦截十字军」是游戏王卡片中的一张效果怪兽卡。2、其效果和「投石区」有相性。本文到此分享完毕,...
4月18日消息,特斯拉上海工厂的员工近日在网上发帖称,在刚刚过去的周末被告知工厂计划削减他们的绩效奖...
4月18日华夏基金管理有限公司发布《华夏基金管理有限公司关于限制华夏鼎瑞三个月定期开放债券型发起式证...
1、我来补充下DVD版至少在影片放映后半年才出。本文分享完毕,希望对大家有所帮助。
1、晕,问题是没有,但怎么买电话产品?不明白。2、那么多好的业务员。本文分享完毕,希望对大家有所帮助。
勃朗宁m1906,勃朗宁手枪这个很多人还不知道,现在让我们一起来看看吧!1、严格意义上来说,勃朗宁手枪其...
据央视新闻,当地时间4月17日,西班牙外交部宣布,由于当地发生武装冲突,位于苏丹首都喀土穆的西班牙驻...
为有效解决人民群众的“急难愁盼”问题,切实缓解小学生暑假“看护难”的现象,今年,石家庄市将继续开...
观点网讯:4月17日,中国首席经济学家论坛理事,瑞信董事总经理、亚太区私人银行高级顾问陶冬发表题为《...
新京报贝壳财经讯4月17日,中国网络视听节目服务协会发布消息,为切实落实广电总局《关于进一步加强网络...
小伙伴们好,带大家回顾下评论员大赞里夫斯现在有球星效应连续打进关键球里夫斯拥有詹眉这样的球员一切...
一线调查居民如何实现居有所乐(主题)人民日报海外版记者彭训文天通苑北街道(下称天北街道)是北京市...
1、简明,扼要,短小,精确,通俗易懂第一步是确定演讲主题。2、此类试题答案组织中,首先要根据题意拟...
梨形小腹的人也有三角洲的烦恼。梨形小腹发生在身体倾向于在中段下部储存脂肪的人。减少腹部脂肪似乎令...
今天来聊聊关于曾志伟电影全集五福星,曾志伟电影全集的文章,现在就为大家来简单介绍下曾志伟电影全集...
股东减持股份对股票会增加市场上的空方力量,引起市场上的投资者恐慌,大量的抛出手中股票,导致股价下...
4月14日,鄂尔多斯市人民政府、伊金霍洛旗人民政府与远景动力在上海举行远景动力智能电池产业园鄂尔多斯...
据美国有线电视新闻网CNN报道,当地时间3月30日,美国疾病控制和预防中心(CDC)证实7名工作人员在调查...
今天来聊聊关于黑龙江农业大学官网,黑龙江农业大学的文章,现在就为大家来简单介绍下黑龙江农业大学官...
1、最低0 27元开通文库会员。2、查看完整内容>原发布者:设计师陈文食物名称碳水化合物食物名称素虾芸豆...
后厨卫生脏乱差,调味品超过保质期……近日,海沧一自助火锅店因存在严重食品安全隐患,被市场监管部门...
本篇为スクフェス2(SIF2)官方推特发布的单格漫画的汉化版。仅供同好嗑糖,禁止擅自转载up主的日语也在...
X 关闭
X 关闭