背景說明
我們平時部署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)或浮點數 (根據顯示長度)
%% 字元"%"