用flask搭建Restful後端,與前端完成通信

環境依賴

  • 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)
        }
    })
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章