<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] >[success] # 負責啟動服務器 server.py ~~~ 1. 創建一個Request,用來封裝每個用戶請求的 method、path、query、body headers、cookies 信息,其中form 保存post 請求從body獲取的參數 2.Reuest 方法中 add_header 把獲取的請求頭數據進行處理封裝到字典 3.add_cookies 獲取封裝header 中的cookies 4.run socket 啟動服務裝置 5.process_request 獲取輸入請求 6.parsed_path 處理get 請求的參數 7.response_for_path 路由映射 ~~~ ~~~ import socket import urllib.parse import _thread from routes.routes_static import route_static from routes.routes_static import route_dict from utils import log class Request: def __init__(self): self.method = "GET" self.path = '' self.query = {} self.body ='' self.headers = {} self.cookies ={} def add_cookies(self): """ 從頭部獲取到cookies 信息 :return: """ cookies = self.headers.get('Cookie', '') kvs = cookies.split('; ') log('cookie', kvs) for kv in kvs: if '=' in kv: k, v = kv.split("=") self.cookies[k] = v def add_header(self, header): lines = header for line in lines: k, v = line.split(': ', 1) self.headers[k] = v self.add_cookies() def form(self): f = {} args = self.body.split("&") log('form debug', args, len(args)) for arg in args: k, v = arg.split('=') f[k] = urllib.parse.unquote(v) return f def error(request, code=404): """ 根據 code 返回不同的錯誤響應 目前只有 404 """ e = { 404: b'HTTP/1.1 404 NOT FOUND\r\n\r\n<h1>NOT FOUND</h1>', } return e.get(code, b'') # socket 啟動開始 def run(host='', port=3000): """ 啟動服務器 """ # 初始化 socket 使用with 可以保證正確關閉socket 釋放的占用的端口 log('start at', '{}:{}'.format(host, port)) with socket.socket() as s: s.bind((host, port)) s.listen(5) while True: connection, address = s.accept() print('連接成功, 使用多線程處理請求', address) # 開一個新的線程來處理請求, 第二個參數是傳給新函數的參數列表, 必須是 tuple # tuple 如果只有一個值 必須帶逗號,就是函數的參數 _thread.start_new_thread(process_request, (connection,)) def process_request(connection): r = connection.recv(1100) log('請求request', r) r = r.decode('utf-8') if len(r.split()) < 2: connection.close() log('r', r.split()) path = r.split()[1] # 進來一個連接創建一個 request 請求對象 request = Request() request.method = r.split()[0] request.add_header(r.split('\r\n\r\n', 1)[0].split('\r\n')[1:]) request.body = r.split('\r\n\r\n', 1)[1] # 用 response_for_path 函數來得到 path 對應的響應內容 response = response_for_path(path, request) # 把響應發送給客戶端 connection.sendall(response) try: log(response.decode('utf-8').replace('\r\n', '\n')) except Exception as e: log('異常', e) # 處理完請求, 關閉連接 connection.close() # 用來判斷 連接是get 還是 post 然后 通過鏈接獲取參數 def parsed_path(path): index = path.find('?') if index == -1: return path,{} else: path, query_string = path.split('?', 1) args = query_string.split('&') query = {} for arg in args: k, v = arg.split('=') query[k] = v return path, query def response_for_path(path, request): path, query = parsed_path(path) request.path = path request.query = query r = { '/static': route_static, } # 注冊外部的路由 r.update(route_dict) response = r.get(path, error) return response(request) if __name__ == '__main__': # 生成配置并且運行程序 config = dict( host='', port=8000, ) run(**config) ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看