環境依賴
-
python
-
flask
-
flask_restplus
restful風格插件 -
flask_cors
進行跨域回覆
準備工作
app = Flask(__name__)
# 24位隨機數加密,用於cookies,可以用os.urandom(24)生成
app.config['SECRET_KEY'] = b'\xb4\xc58\xcb\xed\xa0\xee\xcb\xb3\xb9e\x7f\xfc\xcbr\xbe2\n.b\xea&\x86\xf4'
# swagger文檔的標題與描述
api = Api(app, version='1.0', title='restful api', description='a simple restful app')
# 跨域請求
CORS(app, resources=r'/*')
# 命名空間,要在命名空間中創建api
ns = api.namespace(name='', description='API空間')
編寫API
# 註冊路由,該路由的請求會由後面的類處理
@ns.route('/users/<userid>/info')
class User(Resource):
# swagger文檔內容
@ns.doc(responses={
200: '請求成功',
401: '認證失敗',
404: '沒有該用戶',
}, params={
# 這裏描述url中的變量,同樣是swagger文檔內容
'userid': '用戶id',
})
def get(self, userid):
# get請求會由該函數處理,函數可以捕獲url中的變量當作參數
“”“
判斷權限,從模型層拿數據等操作
”“”
# 返回一個dict,會轉換爲json傳輸,後面跟這次請求的狀態碼
return dict_data,200
def put(self, userid):
pass
………………
其他API
………………
拿數據
在後端自然要獲取前端傳來的各種參數、數據
請求頭中的數據
有的數據會放在http請求同步
token = header.get('Authorization', default_value)
url中的變量
會捕獲爲處理函數的參數,可以直接使用
url中的參數
/xxx/xxx?name=123&pwd=123
如果想拿到url後面的參數,使用
name = request.args.get('name', default_value)
pwd = request.args.get('pwd', default_value)
post表單數據
對於html中的表單,如果設置post請求,發送的就是該類型的數據
request.form.get('key', default_value)
post json數據
該類數據一般是在js文件中構造request發出的
request.json.get('key', default_value)
要特別注意的是,雖然這類方法都可以設置缺省值,但實際上,如果沒有收到該類信息,對應request中的那一類數據就是None,無法調用get,會拋出異常
舉例來說
如果前端發送了json數據,內容是{"name":"123"}
name = request.json.get('name', "admin")
pwd = request.json.get('pwd', "default pwd")
# 結果就是
name = "123"
pwd = "default pwd"
但如果前端沒有發送任何json數據,第一條請求會拋出None沒有get方法的異常
所以爲了程序的健壯性,應該自己捕獲異常,由框架捕獲的話會返回500錯誤碼
與前端通信
前端發送請求會有跨域問題,需要寫明協議,如果用jetbrains家的開發工具,會自動部署一個http服務器,無需擔心發送請求的跨域問題,對於回覆的跨域,前面也用flask_cors
做了處理
這裏使用ajax進行通信
let auth_request = {username: "root", password: "123456"};
let get_access = $.ajax({
url: "http://127.0.0.1:5000/users/auth/get",
//請求數據
data: JSON.stringify(auth_request),
//請求類型
type: "POST",
//返回內容的格式
dataType: "json",
//必須有,說明請求內容的數據格式
contentType: "application/json",
//成功返回後的處理邏輯
success: function (data) {
console.log(data)
access_token = data.token
},
//錯誤返回後的處理邏輯
error: function (err) {
console.log("error:", err)
}
})
請求中包含token信息
對於restful服務來說,一般還有權限認證部分。上面的請求實際在獲取一個權限token,在後面的請求中,需要在頭部帶着獲取到的token進行請求
//ajax是異步請求,需要等待獲取token的請求結束才能開始需要token的請求
$.when(get_access).done(function () {
$.ajax({
url: "http://127.0.0.1:5000/users/root/grades",
//token放入頭部
headers: {"Authorization": access_token},
type: "GET",
dataType: "json",
success: function (data) {
//處理邏輯
},
error: function (err) {
console.log("error:", err)
}
})