Flask(從wsgi開始 一)

運行Flask=開啓一個服務

web應用處理請求的具體流程

  1. 用戶操作操作瀏覽器發送請求;

  2. 請求轉發至對應的web服務器

  3. web服務器將請求轉交給web應用程序,web應用程序處理請求

  4. web應用將請求結果返回給web服務器,由web服務器返回用戶響應結果

  5. 瀏覽器收到響應,向用戶展示

一個`wsgi`服務

全稱Python Web Server Gateway Interface,指定了web服務器和Python web應用或web框架之間的標準接口,以提高web應用在一系列web服務器間的移植性。具體可查看 官方文檔:https://www.python.org/dev/peps/pep-0333/

  1. WSGI是一套接口標準協議/規範;

  2. 通信(作用)區間是Web服務器和Python Web應用程序之間;

  3. 目的是制定標準,以保證不同Web服務器可以和不同的Python程序之間相互通信

from wsgiref.simple_server import make_server


def app(env, start_response):
    # env 獲取請求相關數據
    # start_response
    start_response('200 OK',[('content-type','text/plain'),])
    return [b"hello"]


server = make_server("", 6001, app)
server.serve_forever()  # poll_interval輪詢時間
  1. env:字典,包含請求的所有信息

  2. start_response:在可調用對象中調用的函數,用來發起響應,參數包括狀態碼,headers等

訪問

拓展1(面向過程)

from wsgiref.simple_server import make_server


def app(env, start_response):
    # env 獲取請求相關數據
    # start_response
    url = env['PATH_INFO']
    if url == '/hi':
        start_response('200 OK', [('content-type', 'text/plain'), ])
        return [b"hello"]
    elif url == '/':
        start_response('200 OK', [('content-type', 'text/plain'), ])
        return [b"welcom"]
    else:
        start_response('404 not fount', [('content-type', 'text/plain'), ])
        return [b"not fount"]


server = make_server("", 6001, app)
server.serve_forever()  # poll_interval輪詢時間

這樣可以訪問

  • /hi

  • /

  • 其他路由返回not found

拓展2(字典路由)

# -*- encoding: utf-8 -*-
"""
@File    : day0_1.py
@Time    : 2020/6/13 9:40 上午
@Author  : zhongxin
@Email   : [email protected]
"""
from wsgiref.simple_server import make_server


def home():
    return 'welcome'


def hi():
    return 'hi'


router = {
    "/": home,
    'hi': hi
}


def app(env, start_response):
    url = env.get("PATH_INFO")
    resp = router.get(url)
    if url is None or resp is None:
        start_response('404 not fount', [('content-type', 'text/plain'), ])
        return [b"not fount"]
    else:
        start_response('200 OK', [('content-type', 'text/plain'), ])
    return [resp().encode()]


server = make_server("", 6001, app)
server.serve_forever()  # poll_interval輪詢時間

使用裝飾器拓展

# -*- encoding: utf-8 -*-
"""
@File    : day0_1.py
@Time    : 2020/6/13 9:40 上午
@Author  : zhongxin
@Email   : [email protected]
"""
from wsgiref.simple_server import make_server


class Route:
    def __init__(self):
        self.url = {}

    def route(self, path):
        def decorator(func):
            self.url[path] = func
            func()

        return decorator

    def __call__(self, env, start_response):
        path = env["PATH_INFO"]
        if path in self.url:
            status = '200 OK'
            response_header = [('content-type', 'text/html')]
            start_response(status, response_header)
            return self.url[path]()
        else:
            status = '404 Not Found'
            response_header = [('content-type', 'text/html')]
            start_response(status, response_header)
            return [b"404 not found"]


app = Route()


@app.route('/')
def index():
    yield b'welcome'


@app.route('/hi')
def hi():
    yield b'hello'


server = make_server("", 6001, app)
server.serve_forever()  # poll_interval輪詢時間

一本函數式編程的書:《The Little Schemer》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章