ReflexのバックエンドはFastAPI + Uvicornで構成
Reflexのバックエンドは、FastAPIを使っています。
FastAPI自体は、サーバではないので、Uvicornというサーバアプリを起動させます。
Uvicornの起動時に、FastAPIを利用して書かれたPythonのアプリコードをロードします。
Reflexは、Uvicorn実行コマンドをライブラリ内で定義して間接的に実行させています。
これは、FastAPIの仕組みなので詳しくは、そちらを参照してください。ネットでもたくさん情報がありますし、AIに質問してもよいと思います。
FastAPIの起動コマンドは以下のようになります。(Reflexのコードとは関係ありません。)
- FastAPIを利用したPythonコード。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
- 上記のアプリをUvicornでWebアプリとして起動する。
# mainはモジュール名、appはモジュール内にかかれたFastAPIのオブジェクト名
uvicorn main:app --reload
Reflexのバックエンド起動方法
- Reflexライブラリの「reflex/utils/exec.py」というモジュールに、uvicorn起動処理が「run_backend、run_backend_prod」というメソッドで定義されています。
# Run the backend in development mode.
uvicorn.run(
app=f"{app_module}.{constants.CompileVars.API}",
host=host,
port=port,
log_level=loglevel.value,
reload=True,
reload_dirs=[config.app_name],
reload_excludes=[constants.Dirs.WEB],
)
- 上記のコマンドが、「reflex run」によって起動され、バックエンドサーバが稼働します。
SSLの設定
では、ReflexではHTTPSの有効化、言い換えると、SSLの設定はどうするのでしょうか?
Uvicornは、コマンド実行時に証明書ファイルを設定することでHTTPSを有効化できます。
import uvicorn
if __name__ == "__main__":
uvicorn.run("app.api:app",
host="localhost",
port=8432,
reload=True,
ssl_keyfile="./key.pem",
ssl_certfile="./cert.pem")
ただ、ReflexのUvicorn起動コマンドを見る感じ、ReflexだけではSSLの有効化は難しいようです。
ですので、nginxなどのWebサーバをたてて、そちらでSSLの設定をするのが一般的のようです。
ちなみに、Streamlitは、Streamlit単体でSSLの設定ができます。
configファイルに記載することで可能です。
[server]
sslCertFile = '/path/to/certchain.pem'
sslKeyFile = '/path/to/private.key'
Reflexも同様の設定ができれば、nginxを構築する必要がなく楽なのにと感じます。社内で使うような簡単なものならWebサーバはいらない気もします。
Streamlitの方が先行してつくられている分、細かいところまで楽してできる配慮があります。