python-Flask編寫一個簡單的網路介面(2)--詳解(超基礎)介面傳參

a‘ゞ馬超ۣۣۖิ;̀͒̏ۖ發表於2020-11-26

前言

上一篇中,我大概給你解釋了下它的自帶例子的大概結構同時還把它跑起來,大概看了下它的執行效果,今天我們就來更進一步。
如果你之前學過一些關於網路請求的知識的話,可以跳過下面一個步驟,如果沒有的話,你可以根據我下面的簡介,再配合自己的知識(或者自己百度),大概瞭解下,前後端分離大概是怎麼個分法。

網路請求基本簡介

只大概介紹,只要是為了方便後面flask寫介面用。有些比喻可能不大準確,但是就現在寫介面來說,這樣理解也差不多。

為什麼要前後端分離

為什麼要前後端分離嘞?一個專案直接部署在一起不好嘛,幹嘛分開?,,我當時第一時間聽說到這個概念之後,也是這樣的想法。可是後來我慢慢發現它的好處。。。。。
不知道你有沒有留意到,大部分的廠商在各種平臺都有對應的app。。即使有些平臺的差距特別大,但是他們的app中的資料在不同平臺上都是通用的(個別除外。。)。比如,qq有安卓版,有蘋果版,有windows版本,有mac版本,但是不管你從哪個平臺上登入,你的qq中的資料都沒有改變。甚至你不同平臺登入,它都會相互提示。
這些平臺之間有些差距十分巨大,甚至從構架上都是不同的。那麼,如果你的公司想到各個平臺上都有你的應用,你是不是都要把他們的程式碼都寫一遍,而且你還要留意不同平臺之間公用一個資料庫的相容性?
其實duck不必。你的這些app中,呼叫資料的這部分程式碼大多都是重複的。那麼你為什麼不直接寫只一個標準的,所有客戶端都可以直接呼叫的公共介面嘞?
那麼,這個公共的介面,就可以稱為後臺。(其實前後端分離的好處不止這麼點,但是這裡僅僅只是引入)

前後端分離的好處

不提遠的,就說一個最現實的。只要你寫好了一個後臺介面。你開發網頁版本的可以直接用它,開發小程式可以直接用它,甚至連硬體也可以直接用它。根本不需要任何改寫。
如微信小程式只要一個

wx.request(
	url:"http://xxx.xxx.xx/xxx",
	data:{
		"xx":xx
	},
	sucess:function(res){}
);

就可以直接拿到你後臺處理好了的資料了。

如果你是python程式設計的話,直接:

s = requests.session()
res = s.get(url, params=data, headers=header_code)

如果你想用Ardunio的微控制器來傳送請求的話:

HTTPClient http;
http.begin(GetUrl);
httpCode = http.POST(payload);

當然,如果你想用網頁端請求也是一步到位:

const { data: res } = await this.$http.post('xxx', payload)

反正,,,總的來說,目前對於我們自己,前後端分離了,你就只用寫一個後臺,然後各種平臺的開發你都可以直接用這個介面,而不用每個都重新寫了。

怎麼測試自己的介面

我們大多時候,自己的介面寫好了之後,總會出現一些不盡人意的問題。所以我們可以自己呼叫下試試,來看看自己的介面有沒有什麼bug。
常用的API測試助手嘛,有啥子POST Man之類的,,,但是,emmmm,我因為電腦上安的東西有點多(從前端到後臺,從硬體到軟體,,,還有pytorch的包,,,c盤我是真心擔心它撐不住),反正就是懶得安。你要是感興趣可以自己安一個。。。我這裡直接用內網穿透,然後用別人的網頁版的除錯助手了。。

介面傳參

上面和大家說過了,既然是要和伺服器進行通訊,那麼引數的傳遞時必然的。否則就像別人和你說話的時候一樣。明明已經找到你了,卻啊吧啊吧的瞎比劃,,你根本不知道它讓你怎麼做。
所以接下來我們來簡單的傳個引數。
功能很簡單,就是你給這個介面發啥,它就收啥。
我們一步一步的來。首先,先從控制檯把受到的資料列印出來。

接收資料並處理

from flask import Flask,request # 下面要從request裡面獲取資料,所以要匯入

app = Flask(__name__)


@app.route('/')
def hello_world():
    data = request.get_data() # 直接呼叫函式,並列印
    print(data)
    return 'Hello World!' # 這裡就不改了,待會的效果直接去控制檯看


if __name__ == '__main__':
    app.run(debug=True, port=80)

執行起來
在這裡插入圖片描述
接下來我對著我本地的介面傳送GET請求,並且新增一個引數“my_test:1”
在這裡插入圖片描述
來看看控制檯列印內容
在這裡插入圖片描述
我傳送的請求已經拿到了,但是看見前面的那個“b”了沒?嘿嘿,你再傳送個字串試試?
在這裡插入圖片描述
看看列印

哦吼。。。看不懂了,沒錯。直接這樣獲取資料是不常用滴!
我們一般傳遞的時候是用的JSON資料格式傳的(沒聽過的可以自己百度下)JSON非常的好用,
在這裡插入圖片描述
這裡的頭部也要設定成JSON
這樣
在這裡插入圖片描述

我們設定傳送的格式為JSON,然後我們接收的時候把資料轉化成JSON就可以啦。

from flask import Flask,request
import json # 由於我們用到了Json,所以要匯入
app = Flask(__name__)


@app.route('/',methods=['POST'])
def hello_world():
    data = request.get_data()
    j_data = json.loads(data) # 把資料轉化成json資料
    print(j_data)
    return 'Hello World!'


if __name__ == '__main__':
    app.run(debug=True, port=80)

然後執行叭,
在這裡插入圖片描述
嘿嘿,好了吧。其實還有各種方法都可以,只要你轉化的合理即可(就是傳送請求時的請求頭,和接收闡述之後的轉化對的上就ok了)

返回資料

其實返回資料的話,之前的return已經可以了,,,但是實際需求中,僅僅返回字串的話,肯定不夠用的,比如我要獲得天氣資料,你要一下子就返回天氣,氣溫,溼度等資訊。如果一個字串直接返回,那樣的話,我收到後還要處理提取,太麻煩了。。所以直接也返回JSON格式的資料就可以了。

from flask import Flask,request,jsonify # 用來把返回資料轉化成JSON的
import json
app = Flask(__name__)


@app.route('/',methods=['POST'])
def hello_world():
    data = request.get_data()
    j_data = json.loads(data)
    print(j_data)
    res_data = j_data['my_test']
    msg = {
        "you_data":res_data
    }
    return jsonify(msg)


if __name__ == '__main__':
    app.run(debug=True, port=80)

這是API助手的:
在這裡插入圖片描述
這是串列埠列印的:
在這裡插入圖片描述

可以看到,,API助手的返回資料已經成JSON格式了。

總結

這一章大概的講了下flask怎麼接收引數和返回。當然,這只是其中的一種,還有各種各樣的方法。目前為止,學到的內容已經大概滿足初步的使用了。(可以寫些只用傳普通字元啊,啥子的介面了。比如,emmm,,,xxx倒數計時啥子的,我以前無聊的時候根據八字的演算法寫了個算八字的介面。。後來程式碼搞不見了,害。)當然,你要是會一些其它的庫,還有更多的騷操作。如,emmm,爬取別的網址的資訊,搞自己介面上?,,反正騷操作不少。。。可以自己多摸索下。
下回我給你介紹關於圖片處理。

相關文章