Flask的web框架實現
Flask是python Web框架,自然要遵 WSGI 規範,需要同時實現服務端程序
+應用程序
,並且要豐富完善請求和響應的處理。
Flask自身並沒有實現WSGI,而是依賴werkzeug來實現WSGI程序。在開發時,我們使用flask run
命令啓動Flask,其中服務端程序就是由Werkzeug提供的,應用程序就是Flask中程序實例app
。
flask demo
import time
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
在生產環境中,通常需要一個更強健,性能更高的WSGI服務器。這些 WSGI 服務器也被稱爲 WSGI 容器(Standalone WSGI Container),因爲它們可以高效的處理HTTP請求,調用我們編寫的應用程序。這通常有很多選擇,比如
- gunicorn(http://gunicorn.org/)
- uWSGI(http://uwsgi-docs.readthedocs.io/en/atest/)
- Gevet(http://www.gevent.org/)
- Waitress(https://docs.pylonsproject.org/projects/waitress/en/latest/)
不論是內置的用於開發時使用的服務器Werkzeug,還是gunicorn、uWSGI、Gevent、Waitres等 實現了規範的WSGI服務器,都可以用運行我們的Flask。
werkzeug
由於Flask是依賴werkzeug來實現的服務端程序,下面來認識同樣由Falsk團隊開發的werkzeug模塊。
Werkzeug是一個德語名字,譯爲“工具”的意思,在python中是一個專門用來處理HTTP和WSGI的工具庫
,可以方便的在python程序中處理HTTP協議相關內容。需要注意的是werkzeug不是一個web服務器,也不是一個web框架,而是一個工具包。官方的介紹說是一個WSGI工具包,它可以作爲一個Web框架的服務端庫, 因爲它封裝好了很多Web框架的東西,例如 Request,Response等等。安裝flask時會依賴的安裝好werkzeug。
簡單demo
werkzeug_demo.py
from werkzeug.serving import run_simple
def application(environ, start_response):
start_response('200 ok', [('Content-Type', 'text/html')])
return [b'<h1>hello world!</h1>']
if __name__ == "__main__":
run_simple('localhost', 5000, application)
flask使用werkzeug
flask中如何使用werkzeug作爲服務端程序呢?
在啓動flask時使用的flask run
命令,本質上就是通過werkzeug來啓動一個服務端程序。
def run(self, host='localhost', port=5000, **options):
from werkzeug import run_simple
if 'debug' in options:
self.debug = options.pop('debug')
options.setdefault('use_reloader', self.debug)
options.setdefault('use_debugger', self.debug)
return run_simple(host, port, self, **options)