python Flask框架如何請求及返回數據——flask詳細教程
文章目錄:
1 Flask介紹
1.1 Flask簡單介紹
Flask
是一個相對於Django而言輕量級的Web框架
。它提供了一個web應用後端處理的框架,通過Flask中封裝好的api來進行網頁的渲染、及定製api的實現。
和Django大包大攬不同,Flask
建立於一系列的開源軟件包
之上,這其中 最主要的是WSGI應用開發庫Werkzeug
和模板引擎Jinja
:
-
策略
:werkzeug
和Jinja
這兩個庫和Flask一樣,都是pocoo團隊開發的。這 或許體現了pocoo與Django競爭時關於生態的一種策略,這種策略的自然 延伸是Flask框架
中沒有包含數據庫
方面的構件,無論ORM還是其他。 -
關注點
:Flask是一個WSGI應用框架
,這意味着我們進行Flask開發時,不需要關注網絡方面
的操作,Flask應用的入口
是封裝過的網絡請求包
,出口
是網絡響應
,我們僅需要關注這個階段內的處理邏輯。 -
WSGI服務器
:Flask雖然內置了簡單的WSGI服務器,但其性能僅僅適用於開發期的調試。 Flask官網推薦了多種WSGI服務器,實現方式從多進程到多線程到協程, 這方面的選擇我們在本課程中將不涉及。 -
REST適應性
:雖然Flask和Django一樣,最初的出發點都是服務端的動態網頁應用
。但 Flask的設計使之也相當適用於面向資源的REST架構
,在越來越移動化 並且單頁應用越來越重要的WEB開發領域,這是Flask相對於Django相當大的優勢。
1.2 Flask相關資料信息
1、python Flask官網:
##1.3 Flask文件組織形式
Flask有着特定的文件組織形式,按照Flask文件組織如下:
Appserver/
├── App
│ ├── static/ # 靜態資源文件夾
│ ├── templates/ # 模板文件夾
│ ├── __init__.py
│ ├── run.py # 主程序文件
│ └── config.py # 配置文件
├── requirements # 需求文件
└── README.md
templates文件夾
:存儲html文件static文件夾
:存儲用到的靜態文件
(圖片
,.css
文件等)- run.py:寫flask相關運行程序
2、python Flask中文文檔
2 Flask快速入門
從編寫一個Hello world !
開始:
2.1 Flask編寫一個hello world
創建一個run_flask.py
文件,使用flask運行一個hello world
1、導入Flask類
from flask import Flask
Flask類是Flask框架的核心類,它實現了WSGI應用規範。
WSGI
:Flask內置WSGI,通過使用WSGI封裝了網絡請求
和網絡響應
,這樣我們就不用寫網絡請求和網絡響應的接口了。
2、創建Flask實例對象
app = Flask(__name__)
3、註冊路由(route)
@route('/')
def index():
return 'Hello world!'
4、啓動Flask創建的web服務
if __name__ == '__main__':
app.run()
5、完整程序
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello world!'
if __name__ == '__main__':
app.run()
然後在瀏覽器中輸入:http://127.0.0.1:5000/
就會看到:Hello world!
問候
2.2 Flask編寫一個hello world,程序解析
創建一個run_flask.py
文件,使用flask運行一個hello world
2.2.1 導入Flask類
from flask import Flask
Flask類是Flask框架的核心類,它實現了WSGI應用規範。
WSGI
:Flask內置WSGI,通過使用WSGI封裝了網絡請求
和網絡響應
,這樣我們就不用寫網絡請求和網絡響應的接口了。
2.2.2 創建Flask實例對象
app = Flask(__name__)
print(type(app), app)
# <class 'flask.app.Flask'> <Flask 'run_flask'>
我們實力化Flask對象,這裏初始化了一個參數:import_name=__name__
__name__
:這個參數是模塊或包的名稱
,這樣 Flask 才知道到哪去找模板、靜態文件等等(即上面提到的Flask的文件組織結構)
Flask類的初始化參數:
def __init__(
self,
import_name,
static_url_path=None,
static_folder="static",
static_host=None,
host_matching=False,
subdomain_matching=False,
template_folder="templates",
instance_path=None,
instance_relative_config=False,
root_path=None,
):
# 初始化參數的作用
:param import_name: the name of the application package
:param static_url_path: can be used to specify a different path for the
static files on the web. Defaults to the name
of the `static_folder` folder.
:param static_folder: the folder with static files that should be served
at `static_url_path`. Defaults to the ``'static'``
folder in the root path of the application.
:param static_host: the host to use when adding the static route.
Defaults to None. Required when using ``host_matching=True``
with a ``static_folder`` configured.
:param host_matching: set ``url_map.host_matching`` attribute.
Defaults to False.
:param subdomain_matching: consider the subdomain relative to
:data:`SERVER_NAME` when matching routes. Defaults to False.
:param template_folder: the folder that contains the templates that should
be used by the application. Defaults to
``'templates'`` folder in the root path of the
application.
:param instance_path: An alternative instance path for the application.
By default the folder ``'instance'`` next to the
package or module is assumed to be the instance
path.
:param instance_relative_config: if set to ``True`` relative filenames
for loading the config are assumed to
be relative to the instance path instead
of the application root.
:param root_path: Flask by default will automatically calculate the path
to the root of the application. In certain situations
this cannot be achieved (for instance if the package
is a Python 3 namespace package) and needs to be
manually defined.
2.2.3 註冊路由(route)
使用route() 裝飾器
告訴 Flask 什麼樣的URL
能觸發我們的函數
。
@route('/')
def index():
# 頁面的跳轉交給前端路由負責,後端不用再寫大量的路由
return 'Hello world!'
上面可能看不出來這個說的路由URL出發函數是怎麼一回事,我們把裝飾器的參數再改一下,你就明白了:
@route('/print_hello', methods=["POST"])
def index():
# 頁面的跳轉交給前端路由負責,後端不用再寫大量的路由
return 'Hello world!'
此時在使用POST請求的路由URL ,必須是:
http://127.0.0.1:5000/print_hello`,才能觸發index函數的調用!
2.2.4 啓動Flask創建的web服務
用 run() 函數來讓應用運行在本地服務器上。 其中 if name ==‘main’: 確保服務器只會在該腳本被 Python 解釋器直接執行的時候纔會運行,而不是作爲模塊導入的時候。
1、使用run()默認參數
if __name__ == '__main__':
app.run()
2、run()參數
run(self, host=None, port=None, debug=None, load_dotenv=True, **options):
host
:主機的ip(服務端的ip,即運行flask程序的服務器)- 設置 host=‘0.0.0.0’,讓操作系統監聽所有公網 IP,把自己的電腦作爲服務器,可以讓別人訪問,被人在瀏覽器中輸入你的IP即可
- 設置
host='127.0.0.1'
,這個也是host的默認值
,自己的機器
port
:端口,默認值:port=5000
debug
:是否開啓調試模式,默認值:debug=False
3、開啓調試模式,有兩種方式
- 在應用對象上設置
app.debug = True
app.run()
- 作爲run的參數傳入
app.run(host='0.0.0.0', debug=True)
2.3 例子:flask請求返回處理後的圖片
例子說明:
前端(postman)以POST請求發送一張圖片,後端對圖片進行一個鏡像處理,然後再把這個響應返回前端
例子程序:
__Author__ = "Shliang"
__Email__ = "[email protected]"
import os
import cv2
from flask import Flask, Response, request
app = Flask(__name__)
print(type(app), app)
# <class 'flask.app.Flask'> <Flask 'run_flask'>
print(app.root_path) # 返回的是當前運行文件run_flask.py所在的目錄
# D:\ZF\1_ZF_proj\2_YOLO\YOLO數據集相關
@app.route('/')
def index():
return 'Hello world!'
@app.route('/img_flip', methods=["POST"])
def process_img():
# 接收前端傳來的圖片 image定義上傳圖片的key
upload_img = request.files['image']
print(type(upload_img), upload_img)
# <class 'werkzeug.datastructures.FileStorage'> <FileStorage: 'phone.jpg' ('image/jpeg')>
# 獲取到圖片的名字
img_name = upload_img.filename
# 把前端上傳的圖片保存到後端
upload_img.save(os.path.join('./', upload_img.filename))
# 對後端保存的圖片進行鏡像處理
img_path = os.path.join('./', upload_img.filename)
print('path', img_path)
img = cv2.imread(img_path)
img_flip = cv2.flip(img, 0)
cv2.imwrite(os.path.join('./', 'res_' + upload_img.filename), img_flip)
# 把圖片讀成二進制,返回到前端
image = open(os.path.join('./', 'res_' + upload_img.filename), mode='rb')
response = Response(image, mimetype="image/jpeg")
return response
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
結果如下:
#3 Flask詳細教程
參考1: https://blog.csdn.net/sinat_38682860/article/details/82354342# 個人學習筆記
參考2:https://www.w3cschool.cn/flask/flask_quick_guide.html # w3cschool文檔,比較全
參考3: https://blog.csdn.net/m0_38088298/article/details/79901951
參考4:https://blog.csdn.net/weixin_30553065/article/details/96045980
參考5:
參考6:
參考7:
參考8:
參考9: