摘要:接收用戶請求并分析請求的。執(zhí)行函數(shù)并生成響應(yīng),返回給瀏覽器。這個過程我們稱為注冊路由,路由負責管理和函數(shù)之間的映射,而這個函數(shù)則被稱為視圖函數(shù)。文件是一個名為的文本文件,它存儲了項目中提交時的忽略文件規(guī)則清單。
flask簡述
Flask 是一個基于 Python 開發(fā)并且依賴 jinja2 模板和 Werkzeug WSGI 服務(wù)的一個微型框架,對于 Werkzeug 本質(zhì)是 Socket 服務(wù)端,其用于接收 http 請求并對請求進行預(yù)處理,然后觸發(fā) Flask 框架,開發(fā)人員基于 Flask 框架提供的功能對請求進行相應(yīng)的處理,并返回給用戶,如果要返回給用戶復(fù)雜的內(nèi)容時,需要借助 jinja2 模板來實現(xiàn)對模板的處理,將模板和數(shù)據(jù)進行渲染,將渲染后的字符串返回給用戶瀏覽器。
“微” (micro) 并不表示你需要把整個 Web 應(yīng)用塞進單個 Python 文件(雖然確實可以),也不意味著 Flask 在功能上有所欠缺。微框架中的“微”意味著 Flask 旨在保持核心簡單而易于擴展。
默認情況下,F(xiàn)lask 不包含數(shù)據(jù)庫抽象層、表單驗證,或是其它任何已有多種庫可以勝任的功能。然而,F(xiàn)lask 支持用擴展來給應(yīng)用添加這些功能,如同是 Flask 本身實現(xiàn)的一樣。眾多的擴展提供了數(shù)據(jù)庫集成、表單驗證、上傳處理、各種各樣的開放認證技術(shù)等功能。Flask 也許是“微小”的,但它已準備好在需求繁雜的生產(chǎn)環(huán)境中投入使用。
搭建開發(fā)環(huán)境pipenv 是基于 pip 的 Python 的包管理工具,它和 pip 的用法很相似,可以看作是 pip 的加強版,它的出現(xiàn)解決了舊的 pip+virtualenv+requirements.txt 的工作方式的弊端。可以說 pipenv 是 pip、pipfile、virtualenv 的結(jié)合體,它讓包安裝、包依賴管理和虛擬環(huán)境管理更加方便,使用它可以實現(xiàn)高效的 Python 項目開發(fā)工作流。
安裝在 Linux 或 macOS 系統(tǒng)中使用 sudo 以全局安裝:
sudo pip install pipenv
查看pipenv版本號:
pipenv --version創(chuàng)建虛擬環(huán)境
在 Python 中,虛擬環(huán)境(virtual enviroment)就是隔離的 Python 解釋器環(huán)境。通過創(chuàng)建虛擬環(huán)境,你可以擁有一個獨立的 Python 解釋器環(huán)境。這樣做的好處是可以為每一個項目創(chuàng)建獨立的Python解釋器環(huán)境,因為不同的項目常常會依賴不同版本的庫或 Python 版本。使用虛擬環(huán)境可以保持全局 Python 解釋器環(huán)境的干凈,避免包和版本的混亂,并且可以方便地區(qū)分和記錄每個項目的依賴,以便在新環(huán)境下復(fù)現(xiàn)依賴環(huán)境。
用以下命令為當前的項目創(chuàng)建虛擬環(huán)境:
pipenv install虛擬環(huán)境的目錄
這會為當前項目創(chuàng)建一個文件夾,其中包含隔離的 Python 解釋器環(huán)境,并且安裝 pip、wheel、setuptools 等基本的包。如果是下載的已經(jīng)寫好的程序,并且里面包含 Pipfile 文件,那么這個文件中列出的依賴包,會在這個命令執(zhí)行時一并被安裝。默認情況下,Pipenv 會統(tǒng)一管理所有虛擬環(huán)境。在 Windows 系統(tǒng)中,虛擬環(huán)境文件夾會在 C:UsersAdministrator.virtualenvs 目錄下創(chuàng)建;在 Linux 或 macOS 會在 ~/.local/share/virtualenvs/ 目錄下創(chuàng)建。如果你想在項目目錄內(nèi)創(chuàng)建虛擬環(huán)境文件夾,可以設(shè)置環(huán)境變量
PIPENV_VENV_IN_PROJECT = True
這時名為 .venv 的虛擬環(huán)境文件夾將在項目根目錄被創(chuàng)建。當然我們可以通過--three和--two選項來聲明虛擬環(huán)境中使用的 Python 版本(分別對應(yīng)Python3和Python2),或是使用--python選項指定具體的版本號。同時要確保對應(yīng)版本的Python已經(jīng)安裝在電腦中。用以下命令顯示激活虛擬環(huán)境:
pipenv shell
當執(zhí)行 pipenv shell 或 pipenv run 命令時,Pipenv 會自動從項目目錄下的 .env 文件中加載環(huán)境變量。Pipenv會啟動一個激活虛擬環(huán)境的子 shell ,現(xiàn)在你會發(fā)現(xiàn)命令行提示符前添加了虛擬環(huán)境名“(虛擬環(huán)境名稱)$”,比如:
(helloflask-5Pa0ZfZw) $
這說明我們已經(jīng)成功激活了虛擬環(huán)境,現(xiàn)在你的所有命令都會在虛擬環(huán)境中執(zhí)行。當你需要退出虛擬環(huán)境時,使用 exit 命令。除了顯式地激活虛擬環(huán)境,Pipenv 還提供了一個神奇的命令,允許你不顯式激活虛擬環(huán)境即可在當前項目的虛擬環(huán)境中執(zhí)行命令,比如:
pipenv run python hello.py
這會使用虛擬環(huán)境中的Python解釋器,而不是全局的Python解釋器。事實上,和顯式激活/關(guān)閉虛擬環(huán)境的傳統(tǒng)方式相比,pipenv run是更推薦的做法,因為這個命令可以讓你在執(zhí)行操作時不用關(guān)心自己是否激活了虛擬環(huán)境。
依賴管理在創(chuàng)建虛擬環(huán)境時,如果項目根目錄下沒有 Pipfile 文件,pipenv install 命令還會在項目文件夾根目錄下創(chuàng)建Pipfile和Pipfile.lock 文件,前者用來記錄項目依賴包列表,而后者記錄了固定版本的詳細依賴包列表。當我們使用 Pipen 安裝/刪除/更新依賴包時,Pipfile 以及 Pipfile.lock 會自動更新。你可以使用 pipenv graph 命令查看當前環(huán)境下的依賴情況,或是在虛擬環(huán)境中使用 pip list 命令查看依賴列表。當需要在一個新的環(huán)境運行程序時,只需要執(zhí)行 pipenv install 命令。Pipenv 就會創(chuàng)建一個新的虛擬環(huán)境,然后自動從 Pipfile 中讀取依賴并安裝到新創(chuàng)建的虛擬環(huán)境中。
Pipenv 會自動幫我們管理虛擬環(huán)境,所以在執(zhí)行 pipenv install 安裝 Python 包時,無論是否激活虛擬環(huán)境,包都會安裝到虛擬環(huán)境中。后面我們都將使用 Pipenv 安裝包,這相當于在激活虛擬環(huán)境的情況下使用 pip 安裝包。只有需要在全局環(huán)境下安裝/更新/刪除包,我們才會使用pip。
創(chuàng)建 flask 程序最小的flask程序在此
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "創(chuàng)建程序?qū)嵗?/b>hello flask
"
from flask import Flask app = Flask(__name__)
傳入構(gòu)造方法的第一個參數(shù)是模塊或包的名稱,我們應(yīng)該使用特殊變量 __name__ 。Python 會根據(jù)所處的模塊來賦予 name 變量相應(yīng)的值,對于我們的程序來說(app.py),這個值為 app 。除此之外,這也會幫助 Flask 在相應(yīng)的文件夾里找到需要的資源,比如模板和靜態(tài)文件。
注冊路由@app.route("/") def hello(): return "hello flask
"
在一個 Web 應(yīng)用里,客戶端和服務(wù)器上的 Flask 程序的交互可以簡單概括為以下幾步:
用戶在瀏覽器輸入 URL 訪問某個資源。
Flask 接收用戶請求并分析請求的 URL。
為這個 URL 找到對應(yīng)的處理函數(shù)。
執(zhí)行函數(shù)并生成響應(yīng),返回給瀏覽器。
瀏覽器接收并解析響應(yīng),將信息顯示在頁面中。
在上面這些步驟中,大部分都由 Flask 完成,我們要做的只是建立處理請求的函數(shù),并為其定義對應(yīng)的 URL 規(guī)則。只需為函數(shù)附加 app.route() 裝飾器,并傳入 URL 規(guī)則作為參數(shù),我們就可以讓 URL 與函數(shù)建立關(guān)聯(lián)。這個過程我們稱為注冊路由 (route),路由負責管理 URL 和函數(shù)之間的映射,而這個函數(shù)則被稱為視圖函數(shù) (view function)。route() 裝飾器的第一個參數(shù)是 URL 規(guī)則,用字符串表示,必須以斜杠(/)開始。這里的 URL 是相對 URL(又稱為內(nèi)部 URL ),即不包含域名的 URL。
為視圖函數(shù)綁定多個 URL一個視圖函數(shù)可以綁定多個 URL,比如下面的代碼把 /hi 和 /hello 都綁定到 say_hello() 函數(shù)上,這就會為 say_hello 視圖注冊兩個路由,用戶訪問這兩個 URL 均會觸發(fā) say_hello() 函數(shù),獲得相同的響應(yīng)。
@app.route("/") @app.route("/hello") def index(): return "hello world"為視圖函數(shù)綁定動態(tài) URL
在 URL 規(guī)則中添加變量部分,使用“<變量名>”的形式表示。Flask 處理請求時會把變量傳入視圖函數(shù),所以我們可以添加參數(shù)獲取這個變量值。
@app.route("/greet/") def index(name): return "hello,{}".format(name)
因為 URL 中可以包含變量,所以我們將傳入 app.route() 的字符串稱為 URL 規(guī)則,而不是 URL。Flask 會解析請求并把請求的URL與視圖函數(shù)的URL規(guī)則進行匹配。比如,這個 index 視圖的 URL 規(guī)則為 "/greet/
Flask 內(nèi)置了一個簡單的開發(fā)服務(wù)器(由依賴包 Werkzeug 提供), 足夠在開發(fā)和測試階段使用。Flask 通過依賴包 Click 內(nèi)置了一個 CLI(Command Line Interface,命令行交互界面)系統(tǒng)。當我們安裝 Flask 后,會自動添加一個 flask 命令腳本,我們可以通過 flask 命令執(zhí)行內(nèi)置命令、擴展提供的命令或是我們自己定義的命令。其中,flask run 命令用來啟動內(nèi)置的開發(fā)服務(wù)器。
pipenv run flask run自動發(fā)現(xiàn)程序
一般來說,在執(zhí)行 flask run 命令運行程序前,我們需要提供程序?qū)嵗谀K的位置。我們在上面可以直接運行程序,是因為 Flask 會自動探測程序?qū)嵗詣犹綔y存在下面這些規(guī)則:
從當前目錄尋找 app.py 和 wsgi.py 模塊,并從中尋找名為 app 或 application 的程序?qū)嵗?/p>
從環(huán)境變量 FLASK_APP 對應(yīng)的值尋找名為 app 或 application 的程序?qū)嵗?/p>
因為我們的程序主模塊命名為 app.py,所以 flask run 命令會自動在其中尋找程序?qū)嵗H绻愕某绦蛑髂K是其他名稱,比如 hello.py,那么需要設(shè)置環(huán)境變量 FLASK_APP,將包含程序?qū)嵗哪K名賦值給這個變量。Linux 或 macOS 系統(tǒng)使用 export 命令:
export FLASK_APP=hello管理環(huán)境變量
Flask的自動發(fā)現(xiàn)程序?qū)嵗龣C制還有第三條規(guī)則:如果安裝了 python-dotenv,那么在使用 flask run 或其他命令時會使用它自動從 .flaskenv 文件和 .env 文件中加載環(huán)境變量。當安裝了 python-dotenv 時,F(xiàn)lask 在加載環(huán)境變量的優(yōu)先級是:
手動設(shè)置的環(huán)境變量>.env 中設(shè)置的環(huán)境變量>.flaskenv 設(shè)置的環(huán)境變量。
除了 FLASK_APP,在后面我們還會用到其他環(huán)境變量。環(huán)境變量在新創(chuàng)建命令行窗口或重啟電腦后就清除了,每次都要重設(shè)變量有些麻煩。而且如果你同時開發(fā)多個 Flask 程序,這個 FLASK_APP 就需要在不同的值之間切換。為了避免頻繁設(shè)置環(huán)境變量,我們可以使用 python-dotenv 管理項目的環(huán)境變量,首先使用 Pipenv 將它安裝到虛擬環(huán)境:
pipenv install python-dotenv
我們在項目根目錄下分別創(chuàng)建兩個文件:.env 和 .flaskenv。.flaskenv 用來存儲和 Flask 相關(guān)的公開環(huán)境變量,比如 FLASK_APP;而 .env 用來存儲包含敏感信息的環(huán)境變量,比如后面我們會用來配置 Email 服務(wù)器的賬戶名與密碼。在 .flaskenv 或 .env 文件中,環(huán)境變量使用鍵值對的形式定義,每行一個,以#開頭的為注釋。.env 包含敏感信息,除非是私有項目,否則絕對不能提交到 Git 倉庫中。當你開發(fā)一個新項目時,記得把它的名稱添加到 .gitignore 文件中, 這會告訴 Git 忽略這個文件。gitignore 文件是一個名為 .gitignore 的文本文件,它存儲了項目中 Git 提交時的忽略文件規(guī)則清單。Python項目的.gitignore模板
更多啟動選項 使服務(wù)器外部可見在上面啟動的 Web 服務(wù)器默認是對外不可見的,可以在 run 命令后添加 --host 選項將主機地址設(shè)為 0.0.0.0 使其對外可見
flask run --host=0.0.0.0內(nèi)網(wǎng)穿透工具
ngrok
Localtunnel
改變默認端口Flask 提供的 Web 服務(wù)器默認監(jiān)聽 5000 端口,你可以在啟動時傳入?yún)?shù)來改變它
flask run --port=8000
執(zhí)行 flask run 命令時的 host 和 port 選項也可以通過環(huán)境變量 FLASK_RUN_HOST 和 FLASK_RUN_PORT 設(shè)置。事實上,F(xiàn)lask 內(nèi)置的命令都可以使用這種模式定義默認選項值,即 “FLASK_
開發(fā)環(huán)境(development enviroment)和生產(chǎn)環(huán)境(production enviroment)是我們會頻繁接觸到的概念。
開發(fā)環(huán)境是指我們在本地編寫和測試程序時的計算機環(huán)境,
而生產(chǎn)環(huán)境與開發(fā)環(huán)境相對,它指的是網(wǎng)站部署上線供用戶訪問時的服務(wù)器環(huán)境。
根據(jù)運行環(huán)境的不同,F(xiàn)lask 程序、擴展以及其他程序會改變相應(yīng)的行為和設(shè)置。為了區(qū)分程序運行環(huán)境,F(xiàn)lask 提供了一個 FLASK_ENV 環(huán)境變量用來設(shè)置環(huán)境,默認為 production 。在開發(fā)時,我們可以將其設(shè)為 development ,這會開啟所有支持開發(fā)的特性。為了方便管理,我們將把環(huán)境變量 FLASK_ENV 的值寫入 .flaskenv 文件中:
FLASK_ENV=development
在開發(fā)環(huán)境下,調(diào)試模式(Debug Mode)將被開啟,這時執(zhí)行 flask run 啟動程序會自動激活 Werkzeug 內(nèi)置的調(diào)試器(debugger)和重載器(reloader),它們會為開發(fā)帶來很大的幫助。如果你想多帶帶控制調(diào)試模式的開關(guān),可以通過 FLASK_DEBUG 環(huán)境變量設(shè)置,設(shè)為 1 則開啟,設(shè)為 0 則關(guān)閉,不過通常不推薦手動設(shè)置這個值。
在生產(chǎn)環(huán)境中部署程序時,絕不能開啟調(diào)試模式。盡管 PIN 碼可以避免用戶任意執(zhí)行代碼,提高攻擊者利用調(diào)試器的難度,但并不能確保調(diào)試器完全安全,會帶來巨大的安全隱患。而且攻擊者可能會通過調(diào)試信息獲取你的數(shù)據(jù)庫結(jié)構(gòu)等容易帶來安全問題的信息。另一方面,調(diào)試界面顯示的錯誤信息也會讓普通用戶感到困惑。
當在一個新電腦創(chuàng)建運行環(huán)境時,使用 pipenv install 命令時需要添加額外的 --dev 選項才會安裝 dev-packages 部分定義的開發(fā)依賴包。
在Flask中,配置變量就是一些大寫形式的 Python 變量,你也可以稱之為配置參數(shù)或配置鍵。使用統(tǒng)一的配置變量可以避免在程序中以硬編碼(hard coded)的形式設(shè)置程序。在一個項目中,你會用到許多配置:Flask 提供的配置,擴展提供的配置,還有程序特定的配置。和平時使用變量不同,這些配置變量都通過 Flask 對象的 app.config 屬性作為統(tǒng)一的接口來設(shè)置和獲取,它指向的 Config 類實際上是字典的子類,所以你可以像操作其他字典一樣操作它。
app.config["ADMIN_NAME"]="Eric"
配置的名稱必須是全大寫形式,小寫的變量將不會被讀取。使用 update() 方法則可以一次加載多個值:
app.config.update( TESTING1=True TESTING2=flase )
和操作字典一樣,讀取一個配置就是從config字典里通過將配置變量的名稱作為鍵讀取對應(yīng)的值:
value = app.config["ADMIN_NAME"]URL與端點
在 Web 程序中,URL 無處不在。如果程序中的 URL 都是以硬編碼的方式寫出,那么將會大大降低代碼的易用性。比如,當你修改了某個路由的URL 規(guī)則,那么程序里對應(yīng)的 URL 都要一個一個進行修改。更好的解決辦法是使用 Flask 提供的 url_for() 函數(shù)獲取 URL,當路由中定義的 URL 規(guī)則被修改時,這個函數(shù)總會返回正確的 URL。調(diào)用 url_for() 函數(shù)時,第一個參數(shù)為端點(endpoint)值。在 Flask 中,端點用來標記一個視圖函數(shù)以及對應(yīng)的 URL 規(guī)則。
@app.route("/") def index(): return "hello flask"
這個路由的端點即視圖函數(shù)的名稱 index,調(diào)用 url_for("index")即可獲取對應(yīng)的 URL,即“/”。
如果 URL 含有動態(tài)部分,那么我們需要在 url_for() 函數(shù)里傳入相應(yīng)的參數(shù),以下面的視圖函數(shù)為例:
@app.route("/hello/") def index(name): return "hello {}".format(name)
這時使用 url_for("say_hello",name="Jack")得到的 URL 為“/hello/Jack”。
我們使用 url_for()函數(shù)生成的 URL 是相對 URL(即內(nèi)部URL), 即URL中的path部分,比如“/hello”,不包含根URL。相對URL只能在程序內(nèi)部使用。如果你想要生成供外部使用的絕對 URL,可以在使用 url_for()函數(shù)時,將 _external 參數(shù)設(shè)為 True,這會生成完整的 URL, 比如 http://helloflask.com/hello,在本地運行程序時則會獲得 http://localhost:5000/hello。
除了 Flask 內(nèi)置的 flask run 等命令,我們也可以自定義命令。在虛擬環(huán)境安裝 Flask 后,包含許多內(nèi)置命令的 flask 腳本就可以使用了。在前面我們已經(jīng)接觸了很多 flask 命令,比如運行服務(wù)器的 flask run,啟動 shell 的 flask shell。通過創(chuàng)建任意一個函數(shù),并為其添加 app.cli.command() 裝飾器, 我們就可以注冊一個 flask 命令。hello() 命令函數(shù),在函數(shù)中我們?nèi)匀恢皇谴蛴∫恍袉柡颉?/p>
@app.cli.command() def hello(): click.echo("hello,flask")
函數(shù)的名稱即為命令名稱,這里注冊的命令即 hello,你可以使用 flask hello 命令來觸發(fā)函數(shù)。作為替代,你也可以在 app.cli.command() 裝飾器中傳入?yún)?shù)來設(shè)置命令名稱,比如 app.cli.command("hello"), 會把命令名稱設(shè)置為hello,完整的命令即flask hello。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43771.html
摘要:系列教程,持續(xù)更新系列教程應(yīng)用初見系列教程處理靜態(tài)文件系列教程使用模板引擎系列教程路由控制中間件系列教程綜合搭建登錄注冊頁面系列教程實現(xiàn)登錄注冊功能這篇教程主要介紹構(gòu)建服務(wù)器,簡單引用本教程的版本要格外注意版本號案例簡單利用搭建服務(wù)器文件夾 koa2系列教程,持續(xù)更新 koa2系列教程:koa2應(yīng)用初見 koa2系列教程:koa2處理靜態(tài)文件 koa2系列教程:koa2使用模板引擎 ...
摘要:在學習的過程中時常會聽到一個名次函數(shù)式編程,那么究竟什么是函數(shù)式編程,函數(shù)式編程又有什么優(yōu)點,這就在這篇博客進行一個簡單的總結(jié)吧主要內(nèi)容函數(shù)式編程的概念函數(shù)式編程的優(yōu)點與示例什么是函數(shù)式編程首先,我們放下編程的概念,我們來看函數(shù)。 在學習 JS 的過程中時常會聽到一個名次——函數(shù)式編程,那么究竟什么是函數(shù)式編程,函數(shù)式編程又有什么優(yōu)點,這就在這篇博客進行一個簡單的總結(jié)吧~ 主要內(nèi)容: 函...
摘要:準備好數(shù)據(jù)節(jié)點節(jié)點節(jié)點坐標節(jié)點坐標邊節(jié)點,從哪里出發(fā)節(jié)點,到哪里結(jié)束初始化對象容器渲染位置,表示渲染到圖表的中間位置畫布高渲染數(shù)據(jù)這是渲染出來的效果。鏈接線會以元素為基準。繪制元素時,需要在初始化對象的時候,指定。 hello world // 1. 準備好數(shù)據(jù) // node(節(jié)點) let nodes = [ { id: 1, // 節(jié)點 id ...
閱讀 1414·2021-11-22 09:34
閱讀 1384·2021-09-22 14:57
閱讀 3417·2021-09-10 10:50
閱讀 1398·2019-08-30 15:54
閱讀 3697·2019-08-29 17:02
閱讀 3479·2019-08-29 12:54
閱讀 2621·2019-08-27 10:57
閱讀 3325·2019-08-26 12:24