日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flask服务部署与简单内网穿透

發布時間:2023/12/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flask服务部署与简单内网穿透 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

最近學習部署的時候,想到深度學習里面通常用的部署方法是flask做服務端,然后使用nginx做負載均衡,貌似也能做內網穿透。不過我不太懂負載均衡,只想利用本地電腦搭建一個簡單的服務器,實現外部調用API服務的功能。所以本文會介紹到的內容有:

  • flask服務端與客戶端的通信
  • ngrok簡單地做內網穿透,使得非同一個局域網的電腦能夠通過公網IP訪問服務

國際慣例,參考博客:

flask官方文檔

ngrok官方入口

ngrok的官方文檔

Flask服務端和客戶端

基于flask寫一個上傳文件的功能,不管你傳輸的是圖像還是文字,都可以用這個代碼接收,然后處理完畢再返回一些信息,比如深度學習的預測結果或者狀態信息之類的。

本博客不介紹flask的使用方法,可以去flask官方快速入門章節看到非常詳細的教程。

服務端

仿照flask官方上傳文件的例子,直接寫如下內容:

  • 路由:指示通過什么接口(ip+端口+入口)能夠訪問提供的功能函數
  • 功能:接收客戶端信息,處理,返回結果信息
@app.route('/upload',methods=['POST'],strict_slashes=False) def api_upload():file_dir=os.path.join(basedir,app.config['UPLOAD_FOLDER'])if not os.path.exists(file_dir):os.makedirs(file_dir)f=request.files["myfile"] # 從表單的myfile字段獲取文件,myfile為該表單的name值fname = request.form["name"]if f and allowed_file(fname): # 判斷是否是允許上傳的文件類型f.save(os.path.join(file_dir,fname)) #保存文件到upload目錄 print(url_for('uploaded_file',filename=fname))return jsonify({"succeed":'True',"msg":"upload succeed"})else:return jsonify({"succeed":'False',"msg":"upload failed"})

這里的操作是:

  • 路由:通過本地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服务部署与简单内网穿透的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。