python flask安裝和命令
Flask Web開發實戰學習筆記
Flask簡介
Flask是使用Python編寫的Web微框架。Web框架可以讓我們不用關 心底層的請求響應處理,更方便高效地編寫Web程式。因為Flask核心簡 單且易於擴充套件,所以被稱作微框架(micro framework)。Flask有兩個主 要依賴,一個是WSGI(Web Server Gateway Interface,Web伺服器閘道器 介面)工具集——Werkzeug(http://werkzeug.pocoo.org/),另一個是 Jinja2模板引擎(http://jinja.pocoo.org/)。Flask只保留了Web開發的核心 功能,其他的功能都由外部擴充套件來實現,比如資料庫整合、表單認證、 檔案上傳等。如果沒有合適的擴充套件,你甚至可以自己動手開發。Flask不 會替你做決定,也不會限制你的選擇。總之,Flask可以變成任何你想要 的東西,一切都由你做主。
git管理程式碼
$ git clone https://github.com/greyli/helloflask.git
$ cd helloflask
1.1搭建開發環境
1.1.1Pipenv工作流
PyPI(https://pypi.org)是一個Python包的線上倉庫,截至2018年5 月,共有13萬多個包儲存在這裡。後面我們會學習如何編寫自己的Flask 擴充套件,並把它上傳到PyPI上。到時你就可以使用上面這條命令安裝自己 編寫的包。
現在使用pip安裝Pipenv:
$ pip install pipenv
在Linux或macOS系統中使用sudo以全域性安裝:
$ sudo pip install pipenv
可以使用下面的命令檢查Pipenv是否已經安裝:
$ pipenv --version
1.建立虛擬環境
$ pipenv install
Creating a virtualenv for this project…
...
Virtualenv location: /path/to/virtualenv/helloflask-5Pa0ZfZw
...
附註:
預設情況下,Pipenv會統一管理所有虛擬環境。在Windows系統 中,虛擬環境資料夾會在C:\Users\Administrator\.virtualenvs\目錄下創 建,而Linux或macOS會在~/.local/share/virtualenvs/目錄下建立。如果你 想在專案目錄內建立虛擬環境資料夾,可以設定環境變數 PIPENV_VENV_IN_PROJECT,這時名為.venv的虛擬環境資料夾將在 專案根目錄被建立。
虛擬環境資料夾的目錄名稱的形式為“當前專案目錄名+一串隨機字 符”,比如helloflask-5Pa0ZfZw。
在單獨使用Virtualenv時,我們通常會顯式地啟用虛擬環境。在 Pipenv中,可以使用pipenv shell命令顯式地啟用虛擬環境:
$ pipenv shell
Loading .env environment variables…
Launching subshell in virtual environment. Type 'exit' to return.
提示:
當執行pipenv shell或pipenv run命令時,Pipenv會自動從專案目錄下 的.env檔案中載入環境變數。 Pipenv會啟動一個啟用虛擬環境的子shell,現在你會發現命令列提 示符前添加了虛擬環境名“(虛擬環境名稱)$”,比如:
(helloflask-5Pa0ZfZw) $
這說明我們已經成功激活了虛擬環境,現在你的所有命令都會在虛 擬環境中執行。當你需要退出虛擬環境時,使用exit命令。
除了顯式地啟用虛擬環境,Pipenv還提供了一個pipenv run命令,這 個命令允許你不顯式啟用虛擬環境即可在當前專案的虛擬環境中執行命 令,比如:
$ pipenv run python hello.py
這會使用虛擬環境中的Python直譯器,而不是全域性的Python直譯器
2.管理依賴
在建立虛擬環境時,如果專案根目錄下沒有Pipfile檔案,pipenv install命令還會在專案資料夾根目錄下建立Pipfile和Pipfile.lock檔案,前 者用來記錄專案依賴包列表,而後者記錄了固定版本的詳細依賴包列 表。當我們使用Pipenv安裝/刪除/更新依賴包時,Pipfile以及Pipfile.lock 會自動更新。
1.1.2安裝Flask
$ pipenv install flask
Installing flask...
... Successfully installed Jinja2-2.10 MarkupSafe-1.0 Werkzeug-0.14.1 click-6.7
本文章使用了最新版本的Flask(1.0.2),如果你還在使用舊版本,請 使用下面的命令進行更新:
$ pipenv update flask
1.2 hello flask
使 用下面的命令切換到該目錄:
$ cd demos/hello
在hello目錄下的app.py指令碼中包含一個最小的Flask程式,如程式碼清 單1-1所示。 程式碼清單1-1hello/app.py:最小的Flask程式
from flask import Flask app = Flask(__name__)
@app.route('/') def index(): return '<h1>Hello Flask!</h1>'
1.2.1建立程式例項
我們安裝Flask時,它會在Python直譯器中建立一個flask包,我們可 以通過flask包的構造檔案匯入所有開放的類和函式。我們先從flask包導 入Flask類,這個類表示一個Flask程式。例項化這個類,就得到我們的
程式例項app:
from flask import Flask
app = Flask(__name__)
傳入Flask類構造方法的第一個引數是模組或包的名稱,我們應該使 用特殊變數__name__。Python會根據所處的模組來賦予__name__變數相 應的值,對於我們的程式來說(app.py),這個值為app。除此之外,這 也會幫助Flask在相應的資料夾裡找到需要的資源,比如模板和靜態文 件。
提示
Flask類是Flask的核心類,它提供了很多與程式相關的屬性和方 法。在後面,我們經常會直接在程式例項app上呼叫這些屬性和方法來 實現相關功能。在第一次提及Flask類中的某個方法或屬性時,我們會直 接以例項方法/屬性的形式寫出,比如儲存程式名稱的屬性為app.name。
1.2.2註冊路由
在一個Web應用裡,客戶端和伺服器上的Flask程式的互動可以簡單 概括為以下幾步:
1)使用者在瀏覽器輸入URL訪問某個資源。
2)Flask接收使用者請求並分析請求的URL。
3)為這個URL找到對應的處理函式。
4)執行函式並生成響應,返回給瀏覽器。
5)瀏覽器接收並解析響應,將資訊顯示在頁面中。
在上面這些步驟中,大部分都由Flask完成,我們要做的只是建立處 理請求的函式,併為其定義對應的URL規則。只需為函式附加 app.route()裝飾器,並傳入URL規則作為引數,我們就可以讓URL與函式建立關聯。這個過程我們稱為註冊路由(route),路由負責管理 URL和函式之間的對映,而這個函式則被稱為檢視函式(view function)。
操作:
在這個程式裡,app.route()裝飾器把根地址/和index()函式綁 定起來,當用戶訪問這個URL時就會觸發index()函式。這個檢視函 數可以像其他普通函式一樣執行任意操作,比如從資料庫中獲取資訊, 獲取請求資訊,對使用者輸入的資料進行計算和處理等。最後,檢視函式 返回的值將作為響應的主體,一般來說,響應的主體就是呈現在瀏覽器 視窗的HTML頁面。在最小程式中,檢視函式index()返回一行問候:
@app.route('/') def index(): return '<h1>Hello, World!</h1>'
雖然這個程式相當簡單,但它卻是大部分Flask程式的基本模式。在 複雜的程式中,我們會有許多個檢視函式分別處理不同URL的請求,在 檢視函式中會完成更多的工作,並且返回包含各種連結、表單、圖片的 HTML檔案,而不僅僅是一行字串。返回的頁面中的連結又會指向其 他URL,被單擊後觸發對應的檢視函式,獲得不同的返回值,從而顯示 不同的頁面,這就是我們瀏覽網頁時的體驗。
提示
route()裝飾器的第一個引數是URL規則,用字串表示,必須以 斜槓(/)開始。這裡的URL是相對URL(又稱為內部URL),即不包 含域名的URL。以域名www.helloflask.com為例,“/”對應的是根地址 (即www.helloflask.com),如果把URL規則改為“/hello”,則實際的絕 對地址(外部地址)是www.helloflask.com/hello。 假如這個程式部署在域名為www.helloflask.com的伺服器上,當啟 動伺服器後,只要你在瀏覽器裡訪問www.helloflask.com,就會看到瀏覽器上顯示一行“Hello,Flask!”問候。
1.為檢視繫結多個URL
@app.route('/hi')
@app.route('/hello')
def say_hello():
return '<h1>Hello, Flask!</h1>'
2.動態URL
@app.route('/greet/<name>')
def greet(name):
return '<h1>Hello, %s!</h1>' % name
附註:
當URL規則中包含變數時,如果使用者訪問的URL中沒有新增變數, 比如/greet,那麼Flask在匹配失敗後會返回一個404錯誤響應。一個很常 見的行為是在app.route()裝飾器裡使用defaults引數設定URL變數的默 認值,這個引數接收字典作為輸入,儲存URL變數和預設值的對映。在 下面的程式碼中,我們為greet檢視新添加了一個app.route()裝飾器, 為/greet設定了預設的name值:
@app.route('/greet', defaults={'name': 'Programmer'})
@app.route('/greet/<name>')
def greet(name):
return '<h1>Hello, %s!</h1>' % name
這時如果使用者訪問/greet,那麼變數name會使用預設值 Programmer,檢視函式返回<h1>Hello,Programmer!</h1>。上面的用 法實際效果等同於:
@app.route('/greet')
@app.route('/greet/<name>')
def greet(name='Programmer'):
return '<h1>Hello, %s!</h1>' % name
1.3啟動開發伺服器
$ flask run
* Environment: production
WARNING: Do not use the development server in a production environment. Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
注意:
如果報這個錯誤!
Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.
那就是路徑沒有切到flask 的app.py目錄下!