正確配置Python應用程序

概述:Python模塊和包



在__init__.py中放入代碼


多個環(huán)境&十二因素應用程序
不經(jīng)常更改的靜態(tài)內(nèi)容,或者顯著影響系統(tǒng)行為的內(nèi)容應該存在于代碼中。 頻繁更改的動態(tài)內(nèi)容或應該保密的內(nèi)容(API鍵/憑據(jù))應該存在于代碼之外。
我們?nèi)绾吻袚Q環(huán)境?
Ruby/Rails生態(tài)系統(tǒng)使用RACK_ENV或RAILS_ENV Javascript項目通常會利用NODE_ENV
我的本地開發(fā)環(huán)境沒有設(shè)置一個ENV變量,因此系統(tǒng)默認情況下會推斷開發(fā)環(huán)境。 AWS CodePipeline上的測試環(huán)境使用ENV=test EC2上的生產(chǎn)環(huán)境使用ENV=production
最終的目標


common.py包含我們所有的公共或共享配置。這些東西在不同的環(huán)境中并沒有太大的不同。你可以稱其為base或shared配置,如果你愿意。 environments/development.py包含開發(fā)配置。該文件可以排除在版本控制之外,這樣團隊中的每個開發(fā)人員都可以實現(xiàn)自己的配置設(shè)置。 environments/(production|staging).py包含每個環(huán)境特有的配置。


我們首先導入common配置,以便在默認情況下繼承所有公共配置?,F(xiàn)在我們可以添加、替換或增加參數(shù),而不需要從父配置進行復制粘貼。 為了支持本地開發(fā), 我可以自定義在我的環(huán)境中使用的AWS資源。系統(tǒng)的其余部分沒有改變,但是現(xiàn)在我的本地系統(tǒng)使用我自己的Dynamo表和S3 bucket。 因為該文件不在版本控制中,所以我可以放心地存儲機密信息,比如我自己的GOOGLE_CLIENT_ credentials。 因為可以訪問公共的DEFAULT_NAMESERVERS,所以我可以擴展它們,而不是復制粘貼任何公共值到我自己的配置中。 在生產(chǎn)環(huán)境中,systemd命令用于在響應某些管理操作時重新啟動應用程序。因為我的Mac沒有systemd,所以我用一個簡單的no-op替換了system reboot命令,從而完全避免了這個問題。
它是如何工作的

首先,我們導入importlib模塊(文檔),它為我們提供了一些用代碼導入代碼的方便工具。 使用我們建立的約定—ENV環(huán)境變量—我們獲取當前運行的環(huán)境的名稱。 如果沒有設(shè)置環(huán)境,我們就選擇development作為默認設(shè)置,但是如前所述,這個決定將根據(jù)系統(tǒng)的不同而有所不同。 我們甚至可以考慮阻止應用程序啟動,除非定義了這個變量。下面是一個這樣的例子: 
接下來我們使用importlib.import_module函數(shù)將包含特定環(huán)境代碼的模塊加載到局部變量module中。 最后,我們更新這個模塊的globals,將development.py文件中設(shè)置合并到其中。 最終,你將看到一些便利的工具(a-la Rails),使基于環(huán)境切換具體的邏輯變得更加容易。它們作為函數(shù)保存,以便將實現(xiàn)隔離到此模塊,而不是隔離到使用它的任何地方。
一個真實的例子

development.py在本地使用 production.py用于Heroku test.py用于帶有pytest的本地單元測試

一個在項目的其他地方使用的集中式日志格式。 通用目錄和一個使路徑相關(guān)的工作更容易的助手函數(shù)。 我的服務的時區(qū)。 當頁面不提供自己的標題時使用的默認標題。


SENTRY_DSN只在production.py中被定義,而沒有在base或其他環(huán)境中定義。這是為了防止Sentry(集中式錯誤日志)在開發(fā)或測試情況下被激活。 在Heroku上,Redis連接細節(jié)來自一個URL,因此我們在這里進行了配置。

結(jié)論
我們有創(chuàng)造無限數(shù)量環(huán)境的靈活性。例如,如果我們想為一個拉取請求啟動一個臨時環(huán)境:我們只需要使用“cp environments/staging.py environments/PR_402.py and ENV=PR_402”就可以了。 當在本地進行開發(fā)時,我們可以在生產(chǎn)模式下運行系統(tǒng),方法是在它前面加上ENV=production,反之亦然,我們也可以在開發(fā)或測試模式下在其他任何地方運行軟件。 開發(fā)人員可以通過查看每個環(huán)境被覆蓋的配置來快速收集每個環(huán)境之間的主要差異。這使得將新的團隊成員加入到你的代碼庫中變得更加容易。 類似地,團隊中的每個開發(fā)人員都可以有自己獨特的配置。這不會過多地影響中心配置,因為你的系統(tǒng)有一些不同于其他系統(tǒng)的設(shè)置。 我們可以通過顯式地將environments/test.py 中的某些變量設(shè)置為None來保護我們的測試環(huán)境,以避免意外地訪問生產(chǎn)環(huán)境資源。 我們消除了在各種CLI工具(如Docker等等)之間傳遞較大鍵/值配置映射的負擔(盡管現(xiàn)在的工具越來越能夠從文件中讀取env) 我們將我們的配置公開為一個普通的Python包,因此與其他Python工具幾乎沒有學習曲線和互操作性問題。 我們避免了支持外部庫/依賴項所需要的成本。
文章轉(zhuǎn)載:Python編程學習圈
(版權(quán)歸原作者所有,侵刪)
![]()

點擊下方“閱讀原文”查看更多
評論
圖片
表情
