python Flask框架如何請求及返回數據——flask詳細教程

1 Flask介紹

1.1 Flask簡單介紹

Flask是一個相對於Django而言輕量級的Web框架它提供了一個web應用後端處理的框架,通過Flask中封裝好的api來進行網頁的渲染、及定製api的實現。和Django大包大攬不同,Flask建立於一系列的開源軟件包之上,這其中 最主要的是WSGI應用開發庫Werkzeug模板引擎Jinja

  • 策略werkzeugJinja這兩個庫和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:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章