supervisor的環境變數設定一直報格式錯誤,原來是因為這個符號

背景說明

我們平時部署Flask/Django web專案的時候,都會把一些敏感資訊放到系統的環境變數中,以免程式碼流出的時候洩露敏感資訊,在使用命令啟動專案的時候是可以正常透過`os。getenv(“key”)`來獲取環境變數中的值,但是使用supervisor啟動的時候預設是獲取不到環境變數的,所以需要在supersior的配置檔案中配置environment這個引數。

一般的寫法如下:

environment=DB_HOST=localhost

如果包含特殊字元需要使用雙引號將值包起來,如下:

environment=DB_HOST=localhost,DB_PASSWORD=“test$&%”

問題

在我今天配置環境變數的時候一直報錯,提示格式錯誤,錯誤資訊如下:

for ‘environment’ is badly formatted : unsupported format character ‘“’

錯誤資訊提示的是不支援雙引號,可是我們上面說過如果有特殊字元一定要用雙引號將值包起來的,那問題出在哪呢?

解決

正在我一籌莫展之際,在github看到一個issues終於發現了導致這個問題的元兇——%,是的就是這個百分號,讓雙引號給他背了鍋!

解決辦法也很簡單,如果你的字元裡面有%,使用%%替換。是的,就是將一個百分號,換成兩個百分號。

所以我上面的配置應該寫成:

environment=DB_HOST=localhost,DB_PASSWORD=”test$&%%“

為什麼

打破沙鍋問到底,那為什麼會出現這個問題呢?為什麼兩個百分號就正常了?我們使用python來解釋下:

學過python的朋友應該都知道%是python中的佔位符, 我們在字串處理的時候經常使用,比如:

“tim is %d years old。”% 3

我們經常使用的有%s, %d, %c等,但是有一個不常用的被忽略了,就是%%, 它就代表“%”字元。

下面把佔位符整理一下,大家就清楚了。

%s 字串 (採用str()的顯示)

%r 字串 (採用repr()的顯示)

%c 單個字元

%b 二進位制整數

%d 十進位制整數

%i 十進位制整數

%o 八進位制整數

%x 十六進位制整數

%e 指數 (基底寫為e)

%E 指數 (基底寫為E)

%f 浮點數

%F 浮點數,與上相同

%g 指數(e)或浮點數 (根據顯示長度)

%G 指數(E)或浮點數 (根據顯示長度)

%% 字元"%"