Flask服务部署与简单内网穿透
前言
最近學習部署的時候,想到深度學習里面通常用的部署方法是flask做服務端,然后使用nginx做負載均衡,貌似也能做內網穿透。不過我不太懂負載均衡,只想利用本地電腦搭建一個簡單的服務器,實現外部調用API服務的功能。所以本文會介紹到的內容有:
- flask服務端與客戶端的通信
- ngrok簡單地做內網穿透,使得非同一個局域網的電腦能夠通過公網IP訪問服務
國際慣例,參考博客:
flask官方文檔
ngrok官方入口
ngrok的官方文檔
Flask服務端和客戶端
基于flask寫一個上傳文件的功能,不管你傳輸的是圖像還是文字,都可以用這個代碼接收,然后處理完畢再返回一些信息,比如深度學習的預測結果或者狀態信息之類的。
本博客不介紹flask的使用方法,可以去flask官方快速入門章節看到非常詳細的教程。
服務端
仿照flask官方上傳文件的例子,直接寫如下內容:
- 路由:指示通過什么接口(ip+端口+入口)能夠訪問提供的功能函數
- 功能:接收客戶端信息,處理,返回結果信息
這里的操作是:
- 路由:通過本地ip+端口+/upload訪問此服務
- 功能:讀取服務端發送的文件和文件名,然后保存在本地,返回狀態
【注】
額外說一句,有時候我們要修改函數內容,就不得不重啟服務,但是如果我們使用
app.run(debug=True,host='0.0.0.0',port=5555)將debug設置為True,就可以不用重啟服務,每次修改保存完畢后,服務會自動重啟。
有時候會出現一句話:
WARNING: This is a development server. Do not use it in a production deployment.Use a production WSGI server instead.改成:
serve(app, host="0.0.0.0", port=5555) #product就沒有這個warning了
客戶端
官方新建了一個html作為服務端,我們也可以使用python寫一個客戶端
實現的功能就是:
- 讀取文件為二進制數據,并獲取文件名
- 將文件和文件名發送到服務器
如果想要訪問你的服務的人和你在同一個局域網,可以通過ipconfig先看看自己的ip地址,以下內容均假設我的是192.168.3.10
使用html作為客戶端
這樣就在服務端寫一個html的入口,用戶訪問這個端口的時候,顯示一個上傳界面,然后進行通信
@app.route('/test/upload') def upload_test():return render_template('upload.html')但是需要注意,這個html存在一個名為templates文件夾中
<form id="form1" method="post" action="/upload" enctype="multipart/form-data"><div><input id="File1" type="file" name="myfile"/><input id="name" type="text" name="name"/><input type="submit">提交</input></div> </form>打開服務端以后,直接在電腦上輸入http://192.168.3.10:5555/test/upload就可以進入傳輸界面
使用python寫客戶端
基本就是POST通信方法
def upload_file(file_path):file_bin = open(file_path,'rb').read()upload_content = {"myfile":file_bin}upload_name = {"name":os.path.basename(file_path)}r = requests.post(REST_API_URL,data=upload_name,files=upload_content).json()if(r['succeed']):print("success")else:print("failed")這里有一個REST_API_URL參數,代表的是訪問服務器的地址、端口、入口,所以本文的
REST_API_URL = 'http://192.168.3.10:5555/upload'ngrok內網穿透
有時候用戶和你不在同一個局域網是無法通過上述ip訪問到你的服務的(如果用"0.0.0.0"可以讓用戶訪問你的服務,則無需穿透),所以需要將內網提供服務的端口映射到外網,網上有很多內網穿透的工具和教程,我只是Google了一下ngrok,然后進入第一個網址,看著像官方的,然后引入眼簾的就是這樣一張圖
就是這么簡單,直接去下載你電腦對應的可執行文件,然后直接輸入
ngrok http 5555 pause這就是將內網的5555端口映射到了http://48a7fd5eedbb.ngrok.io,比如上面的那個html網頁,我們可以通過任意一臺聯網電腦訪問,訪問地址為
http://48a7fd5eedbb.ngrok.io/test/upload后記
做算法的,能簡單的快速驗證提供API能力就行啦,至于什么服務分發,交給開發折騰就行。我問了一下身邊的大佬,雖然網上說nginx可以做服務穿透,但是它經常用于服務分發,比如有100個用戶訪問同時同一個服務,部署在一臺電腦上可能會炸了,或者造成等待,那么我們可以通過nginx把這些請求分發到不同服務器上去計算。后續有時間再研究。
完整的python腳本實現放在微信公眾號的簡介中描述的github中,有興趣可以去找找,同時文章也同步到微信公眾號中,有疑問或者興趣歡迎公眾號私信。
總結
以上是生活随笔為你收集整理的Flask服务部署与简单内网穿透的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装串口转USB CH340 驱动后,可
- 下一篇: VUE-周日历的实现