1. 程式人生 > >《Flask Web開發:基於Python的Web應用開發實戰》筆記一

《Flask Web開發:基於Python的Web應用開發實戰》筆記一

開發實戰 返回 2.3 激活 下載 index document main 特殊

一、安裝

簡介:

  • 在大多數標準匯總,Flask都算是小型框架,甚至可以成為“微框架”。同時具備高擴展的能力,具有一個包含基本服務的強健核心,其他功能可通過擴展實現。
  • 兩個主要依賴:路由、調試和Web服務器網關接口子系統有Werkzeug提供;模板系統由Jinja2提供。

1.1、使用虛擬環境

先將實驗文件從git的倉庫中下載到本地,並且切換到1a分支:

$ git clone https://github.com/miguelgrinberg/flasky.git
$ cd flasky
$ git checkout 1a

查看是否安裝了virtualenv(虛擬環境使用第三方實用工具):

virtualenv --version

結果顯示錯誤,則表示沒安裝,安裝命令:

pip install virtualenv

使用virtualenv命令在flasky文件夾中創建Python虛擬環境:

virtualenv venv

virtualenv命令中只要一個必須參數,venv即是虛擬環境的名字。並且會創建一個子文件夾,所有與虛擬環境相關的文件都會保存在這個文件夾中。

  • 激活虛擬環境:
source vev/bin/activate

退出當前虛擬環境,回到全局Python解釋器中:

deactivate

1.2、使用pip命令安裝Python包

進入flasky文件,激活虛擬環境,使用pip命令安裝Flask:

$ cd flasky
$ source venv/bin/activate
$ pip install flask

二、程序的基本結構

2.1、初始化

所有Flask程序都必須創建一個程序實例。Web服務器使用一種WSGI的協議,把接收自客戶端的所有請求都交由這個對象處理。程序實例是Flask類的對象。

from flask import Flask
app = Flask(__name__)

2.2、路由和視圖函數

客戶端把請求發送給Web服務器,Web服務器將請求發送給Flask程序實例。程序實例需要只要知道每個URL請求運行那些代碼,即URL到Python函數的映射關系。
處理URL和Python函數之間的關系的程序成為路由

視圖函數返回的響應可以包括HTML的簡單字符串,也可以是復雜的表單。

2.3、啟動服務器

程序實例用run方法啟動Flask集成的開發Web服務器:

if __name__ == “__main__”:
app.run(debug=True)

2.4、一個完整的程序

將前幾節介紹的Flask Web程序的不同組成部分合並到一個hello.py文件

 from flask import Flask
app = Flask(__name__)

@app.route(‘/‘)
def index():
    return ‘<h1>Hello World!</h1>‘

if __name__ == "__main__":
    app.run(debug=True)

切換到虛擬環境,執行hello.py文件,啟動Flask程序:

技術分享圖片

  • 訪問Flask程序:
$: curl 127.0.0.1:5000

優化成包含動態路由的Flask程序

from flask import Flask
app = Flask(__name__)

@app.route(‘/‘)
def index():
    return ‘<h1>Hello World!</h1>‘

if __name__ == "__main__":
    app.run(debug=True)

測試效果

技術分享圖片

2.5、請求-響應循環

2.5.1、程序和請求上下文

Flask從客戶端接收到的請求,要讓視圖函數訪問請求對象,一種顯而易見的方式就是將其作為參數傳入視圖函數,不過導致程序中的每個視圖函數都會增加一個參數。
為了避免大量可有可無的參數把視圖函數弄的一團糟,Flask使用了上下文臨時把某些對象變為全局可訪問。

在Flask中有兩種上下文:程序上下文和請求上下文

  • 變量名 上下文 說明
  • current_app 程序上下文 當前激活程序的實例
  • g 程序上下文 處理請求時用作臨時存儲的對象,每次請求都會重設這個變量
  • request 請求上下文 請求對象,封裝了客戶端發出的HTTP請求中的內容
  • session 請求上下文 用戶會話,用於存儲請求之間需要“記住”的值的詞典。

2.5.2、請求調度

程序收到客戶端發送的請求,要找到處理該請求的視圖函數。
Flask會在程序的URL映射中查找請求的URL。URL映射是URL和視圖函數之間的對應關系。
Flask使用app.route修飾器或者非修飾器形式的app.add_url_rule()生成映射。

  • 查看Flask程序中的URL映射:(激活虛擬環境)
>> >> from hello import app
>> app.url_map
Map([<Rule ‘/‘ (HEAD, OPTIONS, GET) -> index>,
 <Rule ‘/static/<filename>‘ (HEAD, OPTIONS, GET) -> static>,
 <Rule ‘/user/<name>‘ (HEAD, OPTIONS, GET) -> user>])

URL映射中的HEAD、Options、GET是請求方法,由路由進行處理。

2.5.3、請求鉤子

有時候在處理請求之前或之後執行代碼會很有用。請求鉤子使用修飾器實現,Flask支持以下4種鉤子:

  • before_firest_request: 註冊一個函數,在處理第一個請求之前運行
  • before_request: 註冊一個函數,在每次請求執勤啊運行
  • after_request: 註冊一個函數,如果沒有未處理的異常拋出,在每次請求之後運行。
  • teardown_request: 註冊一個函數,即使有未處理的異常拋出,也在每次請求之後運行。

2.5.4 響應

在大多數情況下,響應就是一個簡單的字符串,作為HTML頁面傳回客戶端。但HTTP協議需要的不僅是作為請求響應的字符串。
其中HTTP響應中一個很重要的部分是狀態碼,Flask默認為200.
make_response()函數可接受1個、2個或3個參數,並返回一個Response對象。

from flask import make_response
@app_route(‘/’)
def index():
response = make_response(‘<h1>This document carries a cookie!</h1>’)
response.set_cookie(‘answer’,’42’)
return response
  • 重定向使用redirect()輔助函數
from flask import redirect 
@app.route(‘/’)
def index():
return redirect(“http://www.example.com”)

還有一種特殊的響應有abort函數生成,用於處理錯誤。

2.6、Flask擴展

使用Flask-Script支持命令行選項
Flask-Script是一個Flask擴展,為Flask程序添加一個命令行解析器。Flask-Script自帶了一組常用選項,而且還支持自定義命令。

  • Flask-Script擴展使用pip安裝:
pip install flask-script
  • 示例把命令解析行功能添加到hello.py程序中需要修改的地方
 from flask import Flask
from flask_script import Manager
app = Flask( __name__ )
manager = Manager( app )

@app.route(‘/’)
def index():
    return ‘<h1>hello,world</h1>’

@app.route(‘/user/<name>’)
def user(name):
    return ‘<h1>hello,%s!</h1>’ % name

if __name__ == “__main__”:
    manager.run()

如果已經從git上克隆了該倉庫,可以直接切換到2c分支上。
這樣修改之後,程序可以使用一組基本命令行選項,現在運行hello.py

技術分享圖片

  • --host參數告訴Web服務器在哪個網絡接口上監聽來自客戶端的連接。
  • --port參數告訴Web服務器在哪個網絡端口。
python hello.py runserver --host 0.0.0.0 --port 9999

技術分享圖片

《Flask Web開發:基於Python的Web應用開發實戰》筆記一