国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python:記一次簡單的模擬flask和cgi服務器

Aldous / 2282人閱讀

摘要:目前來說文章亮點就是解耦做的還行,有一定的可擴展性簡單的仿實現路由分發規定應用程序需要是一個可調用的對象可調用對象接收兩個參數可調用對象要返回一個值,這個值是可迭代的。

最近web服務器知識,中間懶癌犯了,斷了一兩天后思路有點接不上來,手頭上也有其他事情要做,先簡單的總結下學習進度,很多重要的功能都沒跑通,目前flask只是簡單實現路由分顯示不同的結果,cgi可以根據不同的靜態資源或者py腳本文件路徑顯示不同的結果。目前來說文章亮點就是解耦做的還行,有一定的可擴展性
簡單的仿flask實現路由分發
from wsgiref.simple_server import make_server


""""
WSGI規定:
1. 應用程序需要是一個可調用的對象
2. 可調用對象接收兩個參數
3.可調用對象要返回一個值,這個值是可迭代的。
具體參考附錄一,pep-0333標準
"""
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
    
    #路由的分發
    def dispatch_request(self, request):
        print(request)
        path = request.get("PATH_INFO", "").lstrip("/")
        print(path)
        return self.url_map[path]()  # 從url_map中找到對應的處理函數,并調用



#創建一個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服務器,靜態資源的轉發

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."

#處理首頁
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默認使用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會有問題,目前還沒搞清楚+可以,join會有問題 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, 自己寫一個 wsgi 服務器運行 Django 、Tornado 等框架應用
4, 500L:a-simple-web-server
5, python wsgi簡介
6, 從零開始搭建論壇(二):Web服務器網關接口
7, python的 WSGI 簡介
8,本文github源碼

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44610.html

相關文章

  • 【FAILED】一次Python后端開發面試經歷

    摘要:正確的思路是等概率隨機只取出共個數,每個數出現的概率也是相等的隨機輸出把一段代碼改成,并增加單元測試。代碼本身很簡單,即使沒學過也能看懂,改后的代碼如下但是對于單元測試則僅限于聽過的地步,需要用到,好像也有別的模塊。 在拉勾上投了十幾個公司,大部分都被標記為不合適,有兩個給了面試機會,其中一個自己覺得肯定不會去的,也就沒有去面試,另一個經歷了一輪電話面加一輪現場筆試和面試,在此記錄一下...

    kohoh_ 評論0 收藏0
  • 從零開始搭建論壇(一):Web務器與Web框架

    摘要:服務器通過協議與客戶端通信,因此也被稱為服務器。本文標題為從零開始搭建論壇一服務器與框架本文鏈接為更多閱讀自己動手開發網絡服務器一自己動手開發網絡服務器二自己動手開發網絡服務器三服務器網關接口實現原理分析最佳實踐指南應用淺談框架編程簡介 之前用 Django 做過一個小的站點,感覺Django太過笨重,于是就準備換一個比較輕量級的 Web 框架來玩玩。Web.py 作者已經掛掉,項目好...

    dantezhao 評論0 收藏0
  • 如何理解Nginx, WSGI, Flask之間關系

    摘要:通過查閱了些資料,總算把它們的關系理清了。在這個過程中,服務器的作用是接收請求處理請求返回響應服務器是一類特殊的服務器,其作用是主要是接收請求并返回響應。正是為了替代而出現的。三結語最后以,,之間的對話結束本文。 剛轉行互聯網行業,聽到了許多名詞:Flask、Django、WSGI、 Nginx、Apache等等,一直無法搞清楚這些開源項目之間的關系,直至看到這篇文章后感覺醍醐灌頂,以...

    魏明 評論0 收藏0
  • 在Windows平臺使用IIS部署Flask網站

    摘要:在平臺部署基于的網站是一件非常折騰的事情,平臺下有很多選擇,本文記錄了部署到的主要步驟,希望對你有所幫助。下載后運行,搜索,分別安裝。使用命令可以將其移除。在中你可以使用來快捷開發并部署程序,真正讓你一鍵無憂。 在 Windows 平臺部署基于 Python 的網站是一件非常折騰的事情,Linux/Unix 平臺下有很多選擇,本文記錄了 Flask 部署到 IIS 的主要步驟,希望對你...

    2bdenny 評論0 收藏0

發表評論

0條評論

Aldous

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<