概括
- URL:需要操作的對象,也就是資源
- HTTP method:我要對該對象做什么(POST 增、DELETE 刪、GET 查、PUT 和 PATCH 改)
- HTTP status code:操作的結果
做到這個,就達成了 REST 的第二層。
視圖的定義方式
一般視圖都使用 app.route()
裝飾器定義,但是這種方式顯然不適合用於定義 restful api.
對於 restful 場景,flask 提供了 MethodView 類,可以用基於類的方法來定義視圖函數:
class HttpMethodExample(MethodView):
def get(self):
return 'Send request with `GET` method'
def post(self):
return 'Send request with `POST` method'
def put(self):
return 'Send request with `PUT` method'
def patch(self):
return 'Send request with `PATCH` method'
def delete(self):
return 'Send request with `DELETE` method'
# 基於 MethodView 構造視圖函數
example_view = HttpMethodExample.as_view('http_method_example2')
# 為該視圖函數添加 url 規則
app.add_url_rule('/http-method-test2/', view_func=example_view)
flask 還提供了 jsonify 與 request.get_json() 用於序列化與反序列化數據。
flask-rest-api
搜了一番 flask rest 庫,發現比較流行的有 flask-restful、flask-restplus、flask-restless 等,剛開始打算用 flask-restplus,因為它能自動生成 swagger api 文檔。
但是發現它的 schema 是用類似 argparser 的方法做的,而且整個響應解析模塊,在新版將被移除,官方推薦用 marshmallow,但是這方面的資料很少。於是又重做打算。
找了一圈,最后找到個 flask-rest-api,這個模塊使用 marshmallow 定義 schema,用 webargs 解析參數,用 apispec 生成 api 文檔。雖然 stars 比較少,但是開發者正是 marshmallow 等幾個流行庫的 co-leader,感覺是有保障的。
當然新 lib 可能會遇到 bug,但是一是開發者很活躍,issue 基本都能很快得到回復,二是我當下做的也是個個人項目,真出點小毛病問題也不大。
於是就選擇了它。這個庫的 docs 寫得很清晰易懂,而且顯然很新手友好,這是我看中它的原因。目前正在使用它開發我的新項目。筆記就。。寫完再說吧。項目都跑不動,就寫筆記,感覺也不太靠譜。。。
畫外 GraphQL
待續