上一節咱們編寫好了環境管理功能,這一章節我們來繼續完善<code>全局變量</code>功能。
全局變量,其實我覺得叫它全局配置更加貼切。我了解的全局變量,其實是我們常用的一些不太變化的資料,而用例中出現的變量,我認為它是一個臨時的資料,不會進行<code>永久存儲</code>。
那什麼時候會用到這些變量呢?比如咱們的一些常用的測試位址,ip也好url也好,如果用例不把這塊内容抽離出來,一旦位址發生變化,會出現2個問題。
我們需要對用例進行修改
修改的成本較大
有同學可能會說,那我去<code>資料庫</code>裡面直接update一下不就好了?是的,你可以這麼做。但是誰能保證update的時候不會出錯,誰又能保證每一次都能及時update了呢?是以,如果我能在<code>全局變量</code>頁面進行統一修改,那不是事半功倍嗎?這也就是我所說的,它其實更像一個<code>全局配置</code>。
其實我們提供的全局配置,類似于Redis,是一個key-value的形式。使用者如果使用的話,隻需要輸入key,就能夠映射到對應的value。
想象一下,如果一個value能夠存放int,str, float等多種對象,那麼Mysql裡面這個字段該如何設計?是以這個時候我們就要加以輔佐,我們引入一個<code>key_type</code>字段,配合value實作一個字段多種資料類型的功能。
但我這邊又不想太複雜,因為咱都是懶人。其實我們定義幾種類型就夠了:
string
json
yaml
為什麼隻有3種類型?因為已經夠了,如果是string類型,則不需要進行json.loads()去擷取資料,如果是json,我們預設通過json.loads()去轉換一下資料。至于yaml,純粹是為了<code>新鮮</code>。
為什麼說我們用json就可以拿到float,int,bool等等值呢?我們來看一個例子:
那麼我們存在資料庫的值是varchar類型的<code>0.618</code>,那我們放入Python可以表現為這樣:
那怎麼得到float呢?

image.png
同理試一下bool:
至于string為什麼和json區分開,其實json就是個string,是以我們如果遇到string類型就不做任何json.loads的處理,即可保留<code>原滋原味</code>。
env: 變量對應的環境,如果env為0的話,說明這個變量屬于全部環境。
enable: 變量是否可用,是一個開關字段,可臨時關閉該變量
注意這裡有一個聯合唯一索引,根據env,key和deleted_at生成,隻有當env,key,deleted_at都相等的時候,資料庫才不讓插入資料。這樣解決了一個在environment表裡面出現的問題:
<code>當環境abc被删除以後,無法再建立名為abc的環境</code>
看過上一篇文章的都知道細節,其實我寫代碼的時候也是copy的。
大家有沒有發現: <code>編寫一個crud的功能是真的不難!</code>基本可以按照固定的套路來,像我都是copy的上一個功能點的代碼,然後稍作改動。
其實大體上還是和之前的<code>router</code>差不多,但是這裡多了一個細節:
當config router下面有個檔案的時候會怎麼樣?
我們這裡有一個gconfig和一個envrionment,裡面大概8個接口。
envrionment定義了ApiRouter的router對象,gconfig引入了router對象。那麼我們的接口會被成功注冊嗎?
<code>答案是不會的,大家可以試一試。</code>
因為順序是這樣的:
router = ApiRouter() # environment中發生
pity.include_router(config.router)
router注冊gconfig的接口
因為咱們運作的是main.py檔案,main.py在import router的時候肯定是最先發生的。其實flask也會遇到這樣的問題,解決方法有2個。
快速法
main.py注冊router的時候,選用最後一個。
舉個例子,envrionment建立了router,gconfig引入了router,我們從gconfig import router就行。但這樣不會太保險,因為還是可能會遺漏或者搞錯。
利用__init__.py
最後在注冊的時候import init.py裡面的router即可。簡單的說就是搞一個專門收集router的檔案,最後集中注冊。
本期除了寫了全局變量功能以外,還解決了2個問題:
聯合索引問題
router注冊問題
希望對大家有幫助~
後端位址: https://github.com/wuranxu/pity
前端位址: https://github.com/wuranxu/pity