摘要:目前來(lái)說(shuō)文章亮點(diǎn)就是解耦做的還行,有一定的可擴(kuò)展性簡(jiǎn)單的仿實(shí)現(xiàn)路由分發(fā)規(guī)定應(yīng)用程序需要是一個(gè)可調(diào)用的對(duì)象可調(diào)用對(duì)象接收兩個(gè)參數(shù)可調(diào)用對(duì)象要返回一個(gè)值,這個(gè)值是可迭代的。
最近web服務(wù)器知識(shí),中間懶癌犯了,斷了一兩天后思路有點(diǎn)接不上來(lái),手頭上也有其他事情要做,先簡(jiǎn)單的總結(jié)下學(xué)習(xí)進(jìn)度,很多重要的功能都沒(méi)跑通,目前flask只是簡(jiǎn)單實(shí)現(xiàn)路由分顯示不同的結(jié)果,cgi可以根據(jù)不同的靜態(tài)資源或者py腳本文件路徑顯示不同的結(jié)果。目前來(lái)說(shuō)文章亮點(diǎn)就是解耦做的還行,有一定的可擴(kuò)展性簡(jiǎn)單的仿flask實(shí)現(xiàn)路由分發(fā)
from wsgiref.simple_server import make_server """" WSGI規(guī)定: 1. 應(yīng)用程序需要是一個(gè)可調(diào)用的對(duì)象 2. 可調(diào)用對(duì)象接收兩個(gè)參數(shù) 3.可調(diào)用對(duì)象要返回一個(gè)值,這個(gè)值是可迭代的。 具體參考附錄一,pep-0333標(biāo)準(zhǔn) """ class SimServer(object): def __init__(self): self.url_map = {} def __call__(self, environ, start_response): status = u"200 OK" response_headers = [("Content-type", "text/plain")] start_response(status, response_headers) data=self.dispatch_request(environ) return [data.encode("utf-8"),] def run(self, ip=None, host=None): if not ip: ip = "" if not host: host = 8080 httpd = make_server(ip, host, self) httpd.serve_forever() #路由裝飾器 def route(self, rule): def decorator(f): self.url_map[rule.lstrip("/")] = f return f return decorator #路由的分發(fā) def dispatch_request(self, request): print(request) path = request.get("PATH_INFO", "").lstrip("/") print(path) return self.url_map[path]() # 從url_map中找到對(duì)應(yīng)的處理函數(shù),并調(diào)用 #創(chuàng)建一個(gè)app app=SimServer() @app.route("/index") def index(): return "hello world" @app.route("/login") def login(): return "please login" if __name__=="__main__": app.run() if __name__=="__main__": app.run()CGI web服務(wù)器,靜態(tài)資源的轉(zhuǎn)發(fā)
handler.py
import os import subprocess class BaseHandler(object): """Parent for case handlers.""" def handle_file(self, handler, full_path): try : with open(full_path, "rb") as reader: content = reader.read() handler.send_content(content) except IOError as msg: msg = ""{0}" cannot be read: {1}".format(full_path, msg) handler.handle_error(msg) def index_path(self, handler): return os.path.join(handler.full_path, "index.html") def test(self, handler): assert False, "Not implemented." def act(self, handler): assert False, "Not implemented." #處理首頁(yè) class Case_directory_idnex_file(BaseHandler): def test(self, handler): return (os.path.isdir(handler.full_path) and os.path.isfile(self.index_path(handler))) def act(self, handler): self.handle_file(handler, self.index_path(handler)) #處理普通html文件 class Case_existing_file(BaseHandler): def test(self, handler): return os.path.isfile((handler.full_path)) def act(self, handler): self.handle_file(handler,handler.full_path) #處理python腳本 class Case_cgi_file(BaseHandler): def run_cgi(self, handler): print("dfs") print(handler.full_path) data=subprocess.getoutput(["python",handler.full_path]) print("data={}".format(data)) #python3默認(rèn)使用unicode,需要encode("utf-8") return handler.send_content(data.encode("utf-8")) def test(self,handler): return os.path.isfile(handler.full_path) and handler.full_path.endswith(".py") def act(self,handler): self.run_cgi(handler)
requestHandler.py
from http.server import BaseHTTPRequestHandler,HTTPServer import os from simpleServer.handler import * class RequestHandler(BaseHTTPRequestHandler): Cases = [Case_cgi_file(),Case_directory_idnex_file(),Case_existing_file() ,] # How to display an error. Error_Page = """參考附錄Error accessing {path}
{msg}
""" # Classify and handle request. def do_GET(self): try: # 使用join會(huì)有問(wèn)題,目前還沒(méi)搞清楚+可以,join會(huì)有問(wèn)題 self.full_path = os.getcwd()+self.path # Figure out how to handle it. print("cases{}".format(self.Cases)) for case in self.Cases: if case.test(self): case.act(self) break # 處理異常 except Exception as msg: print(msg) self.handle_error(msg) # Handle unknown objects. def handle_error(self, msg): content = self.Error_Page.format(path=self.path, msg=msg) self.send_content(content.encode("utf-8"), 404) # Send actual content. def send_content(self, content, status=200): self.send_response(status) self.send_header("Content-type", "text/html") self.send_header("Content-Length", str(len(content))) self.end_headers() self.wfile.write(content) if __name__=="__main__": severAddress=("",8000) server=HTTPServer(severAddress,RequestHandler) server.serve_forever()
1, pyton:pep-0333
2, flask作者博客文章:getting-started-with-wsgi
3, 自己寫(xiě)一個(gè) wsgi 服務(wù)器運(yùn)行 Django 、Tornado 等框架應(yīng)用
4, 500L:a-simple-web-server
5, python wsgi簡(jiǎn)介
6, 從零開(kāi)始搭建論壇(二):Web服務(wù)器網(wǎng)關(guān)接口
7, python的 WSGI 簡(jiǎn)介
8,本文github源碼
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44610.html
摘要:正確的思路是等概率隨機(jī)只取出共個(gè)數(shù),每個(gè)數(shù)出現(xiàn)的概率也是相等的隨機(jī)輸出把一段代碼改成,并增加單元測(cè)試。代碼本身很簡(jiǎn)單,即使沒(méi)學(xué)過(guò)也能看懂,改后的代碼如下但是對(duì)于單元測(cè)試則僅限于聽(tīng)過(guò)的地步,需要用到,好像也有別的模塊。 在拉勾上投了十幾個(gè)公司,大部分都被標(biāo)記為不合適,有兩個(gè)給了面試機(jī)會(huì),其中一個(gè)自己覺(jué)得肯定不會(huì)去的,也就沒(méi)有去面試,另一個(gè)經(jīng)歷了一輪電話面加一輪現(xiàn)場(chǎng)筆試和面試,在此記錄一下...
摘要:服務(wù)器通過(guò)協(xié)議與客戶端通信,因此也被稱為服務(wù)器。本文標(biāo)題為從零開(kāi)始搭建論壇一服務(wù)器與框架本文鏈接為更多閱讀自己動(dòng)手開(kāi)發(fā)網(wǎng)絡(luò)服務(wù)器一自己動(dòng)手開(kāi)發(fā)網(wǎng)絡(luò)服務(wù)器二自己動(dòng)手開(kāi)發(fā)網(wǎng)絡(luò)服務(wù)器三服務(wù)器網(wǎng)關(guān)接口實(shí)現(xiàn)原理分析最佳實(shí)踐指南應(yīng)用淺談框架編程簡(jiǎn)介 之前用 Django 做過(guò)一個(gè)小的站點(diǎn),感覺(jué)Django太過(guò)笨重,于是就準(zhǔn)備換一個(gè)比較輕量級(jí)的 Web 框架來(lái)玩玩。Web.py 作者已經(jīng)掛掉,項(xiàng)目好...
摘要:通過(guò)查閱了些資料,總算把它們的關(guān)系理清了。在這個(gè)過(guò)程中,服務(wù)器的作用是接收請(qǐng)求處理請(qǐng)求返回響應(yīng)服務(wù)器是一類特殊的服務(wù)器,其作用是主要是接收請(qǐng)求并返回響應(yīng)。正是為了替代而出現(xiàn)的。三結(jié)語(yǔ)最后以,,之間的對(duì)話結(jié)束本文。 剛轉(zhuǎn)行互聯(lián)網(wǎng)行業(yè),聽(tīng)到了許多名詞:Flask、Django、WSGI、 Nginx、Apache等等,一直無(wú)法搞清楚這些開(kāi)源項(xiàng)目之間的關(guān)系,直至看到這篇文章后感覺(jué)醍醐灌頂,以...
摘要:在平臺(tái)部署基于的網(wǎng)站是一件非常折騰的事情,平臺(tái)下有很多選擇,本文記錄了部署到的主要步驟,希望對(duì)你有所幫助。下載后運(yùn)行,搜索,分別安裝。使用命令可以將其移除。在中你可以使用來(lái)快捷開(kāi)發(fā)并部署程序,真正讓你一鍵無(wú)憂。 在 Windows 平臺(tái)部署基于 Python 的網(wǎng)站是一件非常折騰的事情,Linux/Unix 平臺(tái)下有很多選擇,本文記錄了 Flask 部署到 IIS 的主要步驟,希望對(duì)你...
閱讀 1519·2021-11-23 09:51
閱讀 3639·2021-09-26 09:46
閱讀 2125·2021-09-22 10:02
閱讀 1818·2019-08-30 15:56
閱讀 3319·2019-08-30 12:51
閱讀 2224·2019-08-30 11:12
閱讀 2060·2019-08-29 13:23
閱讀 2323·2019-08-29 13:16