用python為mysql實現restful介面

發表於2016-01-23

最近在做遊戲服務分層的時候,一直想把mysql的訪問獨立成一個單獨的服務DBGate,原因如下:

  1. 請求收攏到DBGate,可以使DBGate變為無狀態的,方便橫向擴充套件
  2. 當請求量或者儲存量變大時,mysql需要做分庫分表,DBGate可以內部直接處理,外界無感知
  3. 通過restful限制對資料請求的形式,僅支援簡單的get/post/patch/put 進行增刪改查,並不支援複雜查詢。這個也是和遊戲業務的特性有關,如果網站等需要複雜查詢的業務,對此並不適合
  4. DBGate使用多程式模式,方便控制與mysql之間的連結數,進行mysql訪問量閥值保護
  5. 方便在DBGate上進行訪問量統計,慢查詢統計、許可權控制等等一系列邏輯
  6. 目前是使用python,以後要使用其他語言進行mysql操作時,只要進行標準的http請求即可,不會出現不相容的情況

當然壞處也是有的:

  1. 首當其衝就是單次請求的響應時間變長,畢竟中間加了一層服務,並且還是http格式
  2. 部署上比原來複雜了一些,很多對mysql直接操作的思維需要進行轉變,一開始可能會有些不適

不過總的來說,還是利大於弊,所以最終還是決定搭建DBGate

當然,我們不可能去手工挨個寫每個庫表對應的restful服務,值得慶幸的是django和flask都提供了對應的解決方案,我們一個個介紹.

Flask

參考連結: flask-restless

flask-restless使用方法比較簡單,我直接貼一下程式碼即可:

 

其對應的restful操作如下:

 

注意:

  1. 在http請求中,記得加入header: Content-Type: application/json
  2. flask-restless中,PUT和PATCH一樣,都是傳入什麼欄位,只修改什麼欄位,不會完全覆蓋

Django

參考連結: Django REST framework

Django用起來要更復雜一些,也因為django版自帶了一個視覺化的操作頁面,如下:

QQ20140803 2

1. 在settings中新增:

2. 通過startapp建立一個app: demo

3. 修改demo的models:

4. 在demo下新建serializers.py

5. 在demo下修改views.py

6. 在demo下新建urls.py

7. 在mysite.urls下include demo.urls和rest_framework.urls

8. 執行初始化資料操作:

之後訪問: http://127.0.0.1:8000/demo 即可看到如下介面了:

QQ20140803 1

對應的測試程式碼如下:

Django REST framework 是嚴格區分PUT和PATCH的,這一點和flask-restless 不一樣,需要注意。

OK,就這樣。

相關文章