第十四章 應用程式設計介面(二)

2021-10-03 17:36:28 字數 2864 閱讀 4043

使用flask建立rest式web服務十分簡單。使用熟悉的route()裝飾器及其methods可選引數可以宣告服務及其所提供資源url的路由。處理json資料同樣簡單,請求中的json資料可以使用request.get_json()轉換成字典格式,還可以使用flask提供的輔助函式jsonify()從python字典中生成需要包含json的響應。

如果以後需要建立乙個向前相容的api版本,可以再新增乙個帶版本號的包,讓應用同時支援兩個版本的api。api藍本在api包構造檔案中定義: 

from flask import blueprint

api = blueprint('api', __name__)

from . import authentication, comments, errors, posts, users

注意:一定要匯入藍本中的所有模組,這樣才能註冊路由和錯誤處理程式。因為這些模組同時也要匯入藍本物件以定義路由,所以這些模組都在__init__.py的底部匯入,避免出現迴圈匯入。

...

...# 註冊api藍本

from .api import api as api_blueprint

註冊api藍本時指定了乙個url字首,因此藍本所有url都以/api/v1開頭。使用網域名稱部署時,我們也會通過subdomain引數指定子域。(例如是的乙個子域)。

rest式web服務將請求的狀態告知客戶端時,會在響應中傳送適當的http狀態碼,並將額外資訊放入響應主體。api返回的常見http狀態碼如下:

http狀態碼

名稱說明

200ok

請求成功

201created

建立了乙個新資源

202accepted

請求已接收,但仍在處理中,將非同步處理

204no content

請求已成功處理,但返回的響應沒有資料

400bad request

請求無效或不一致

401unauthorized

請求未包含身份驗證資訊,或者提供的憑據無效

403forbidden

禁止訪問

404not found

資源未找到

405method not allowed

指定資源不支援請求使用的方法

500internal server error

伺服器發生錯誤

404,405,500錯誤由flask自己生成,而且一般會返回html響應。這會使客戶端很困惑,因為客戶端期望所有的響應都是json格式。解決辦法是「內容協商」。根據http的內容協商機制,在錯誤處理程式中根據客戶端請求格式來改寫響應。

from flask import render_template, request, jsonify

from . import main

def page_not_found(e):

if request.accept_mimetypes.accept_json and not request.accept_mimetypes.accept_html:

response = jsonify()

response.status_code = 404

return response

return render_template('404.html'), 404

def internal_server_error(e):

if request.accept_mimetypes.accept_json and not request.accept_mimetypes.accept_html:

response = jsonify()

response.status_code = 500

return response

return render_template('500.html'), 500

# 405通常只發生在api中,我們直接返回json響應

def method_not_allowed(e):

response = jsonify(error="the method is not allowed for the requested url.")

response.status_code = 405

return response

新版的全域性錯誤處理程式檢查accept請求首部(解碼為request.accept_mimetypes),根據首部的值決定客戶端期望接收的響應格式。僅當客戶端接收的響應列表中包含json但不包含html時,才生成json響應。

其它狀態碼都由web服務生成,可在api藍本的errors.py模組中以輔助函式的形式實現:

from flask import jsonify

from . import api

def bad_request(message):

response = jsonify()

response.status_code = 400

return response

def unauthorized(message):

response = jsonify()

response.status_code = 401

return response

def forbidden(message):

response = jsonify()

response.status_code = 403

return response

IAP 應用程式設計

1 檢查是否需要對第二部分 進行更新 2 如果不需要更新則轉到4 3 執行更新操作 4 跳轉到第二部分 執行 第一部分 必須通過其它手段,如jtag或isp燒入 第二部分 可以使用第一部分 iap功能燒入,也可以和第一部分 一道燒入,以後需要程式更新是再通過第一部分iap 更新。對於stm32來說,...

串列埠應用程式設計

include include 標準輸入輸出定義 include 標準函式庫定義 include unix 標準函式定義 include include include 檔案控制定義 include ppsix 終端控制定義 include 錯誤號定義 include include include...

Linux應用程式設計學習記錄(二)

今天來繼續學習檔案操作的相關api。早上查了下資料,發現現在學的這些api隸屬於posix標準,posix翻譯過來就是可移植作業系統介面,在unix類系統中應用的十分廣泛。處理檔案的api還有很多別的標準,比如ansi c標準,它應該是標準c語言提供的庫函式。在別人的文章中看到,這二者比較起來的話,...