LoginSignup
0
0

More than 1 year has passed since last update.

uWSGIで.envの値をまとめて環境変数として渡す方法とハマリポイント

Last updated at Posted at 2021-11-14

概要

uWSGIは、例えばWebサーバであるNginxとアプリケーションであるFlaskの仲立ちをしてくれるサーバです。
.envはいろいろな用途がありますが、ここではその環境に必要な環境変数を記載しておくファイルとして扱います。

そこで2つを合わせて、uWSGIから.envを読み込んでアプリケーションに環境変数をまとめて渡したい!というシチュエーションがありえます。もちろん、アプリケーション側から直接.envを読み込む方法もあるでしょう。今回は、前者のやり方と自分がハマったポイントを紹介します。

環境

  • uWSGI 2.0.20

.envを使わない場合

hoge.ini
[uwsgi]
env = MY_SECRET_KEY_1=mysecretkey1
env = MY_SECRET_KEY_2=mysecretkey2

envを使うことで、アプリケーションに環境変数MY_SECRET_KEY_1MY_SECRET_KEY_2を渡せます。

しかし、たくさんあるときは1つ1つ書くのは大変です。

.envを使ってまとめて読み込む

.env
MY_SECRET_KEY_1=mysecretkey1
MY_SECRET_KEY_2=mysecretkey2
hoge.ini
[uwsgi]
for-readline = path/to/.env
  env = %(_)
endfor = 

.envには、アプリケーションに読み込ませたい環境変数を記述しておきます。そして、for-readlineで.envファイルを読み込み、1行ずつenvします。path/to/.envのところにはワーキングディレクトリからの相対パスか絶対パスを指定します。

.envの場所を変数として渡したい

ここからがハマリポイント。結論は、for-readlineにプレースホルダを使ってはいけない、です。

プレースホルダとはuWSGIにおける変数で、プレースホルダを介してfor-readlineに.envのパスを渡したいと考えるわけです。自分もそうでした。

hoge.ini
[uwsgi]
project_root = /path/to/project

for-readline = %(project_root)/.env
  env = %(_)
endfor = 

プレースホルダはコマンドライン引数からも指定できます。

sudo uwsgi  --set-placeholder project_root=/path/to/project --ini hoge.ini

残念ながら、これはうまく動きません。.envファイルが存在しないというエラーが出てしまいます。

[uWSGI] getting INI configuration from /path/to/hoge.ini
open("%(project_root)/.env"): No such file or directory [core/config.c line 96]

githubにissueが立っており、おそらくバグのようです。長らく放置気味です。自分は諦めて相対パスを使いました。

githubの全体検索で、他の方達がどうfor-readlineをつかっているかがわかります。
https://github.com/search?p=2&q=for-readline&type=Code

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0