Run flask via waitress

Kanglin WuKanglin Wu
1 min read

Background

在開發階段 Flask default 所提供的 WSGI ( Python Web Server Gateway Interface ) 連官方都提醒僅適用於開發環境,那之前我都是透過 Gunicorn 跑在前面,這次我想嘗試看看用 Waitress,因此產出了這篇筆記。


Purpose

  • 為了避免 Flask 不穩,先改用 waitress 取代原本的 Werkzeug

  • Enable SSL。


手順

1. 安裝 waitress

透過 pip 套件管理安裝,目前專案用 pipenv 管理。

pipenv install waitress

2. 修改既有 app.py

目前專案的 flask run 是 based on app.py,所以為了要讓 waitress 在運行時,知道是在為哪隻 python script 服務,要將剛剛所安裝的 waitress module 裡的 serve import 進去。

另外,因為該 service 需要掛 certificate 以支援 HTTPS 連線,在不想要在前面再新增一台 nginx 去做 reverse proxy 的前提下,直接透過 Python 裡內建的 ssl 去處理。

# WSGI
from waitress import serve

# SSL
import ssl

# 將原本的 app.run 改成 serve, 目前這樣的設定代表該 service listen 0.0.0.0:50924
if __name__ == "__main__":
    # Create SSL context
    context = ssl.SSLContext(ssl.PROTOCOL_TLS)
    context.load_cert_chain(certfile='./static/k8s.crt', keyfile='./static/k8s.key')

    # Serve with SSL
    serve(app, host='0.0.0.0', port=50920, ssl_context=context)

3. 運行方式

從原本的 flask run 改成用 waitress

python app.py

Case - 如果前面有 reverse proxy server 做 ssl 處理

僅需要在原本擁有 app.py 的 folder 底下,透過 waitress-server 直接 run service。( 要先做完手順 1 的安裝 )

waitress-serve --port=50920 app:app

結語

不過實際上轉成 waitress 後,我還有遇到 access log 的問題,這部分可以之後再開一篇來做紀錄,以及如何將其容器化的手順。


參考

https://minglunwu.com/notes/2021/flask_plus_wsgi.html/
https://flask.palletsprojects.com/en/2.3.x/deploying/
https://docs.pylonsproject.org/projects/waitress/en/latest/
https://github.com/Pylons/waitress?tab=readme-ov-file

0
Subscribe to my newsletter

Read articles from Kanglin Wu directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Kanglin Wu
Kanglin Wu