[貳]Flask web開發:程序的基本結構

本系列筆記是我閱讀Miguel Grinberg的《Flask Web Development》的筆記,標題與書本同步。但願經過記錄技術筆記的方式促進本身對知識的理解。python

本篇對應書本第二章:程序的基本結構。web

初始化

from flask import Flask #導入Flask模塊
app = Flask(__name__) #建立Flask類的實例

注:對於Flask開發者來講,傳給Flask應用程序構造函數的name參數是比較容易弄混淆的。Flask使用這個參數來肯定應用程序的根目錄,這樣之後能夠相對這個路徑來找到資源文件。flask

路由和視圖函數

註冊新的路由

在Flask應用中,路由是指用戶請求的URL與視圖函數之間的映射。
Flask框架 根據HTTP請求的URL在路由表中匹配預約義的URL規則,找到對應的視圖函數, 並將視圖函數的執行結果返回WSGI服務器。
服務器

匹配動態URL

route裝飾器 :可使用Flask應用實例的route裝飾器將一個URL規則綁定到一個視圖函數上。
下面程序中route裝飾器將根目錄綁定在index視圖上。cookie

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

URL變量類型過濾

@app.route('/user/<name>')
def user(name):
    return '<h1>Hello, %s</h1>' % name

相似:
int    接受整數(float接受浮點數)
@app.route('/post/<int:post_id>')
path轉換器容許規則匹配包含/的字符串。
@app.route('/file/<path:fname>')

啓動服務器

if __name__ == '__main__':
    app.run(debug=True)
    
# 模塊是對象,而且全部的模塊都有一個內置屬性 __name__。
# 一個模塊的 __name__ 的值取決於您如何應用模塊。
# 若是 import 一個模塊,那麼模塊__name__ 的值一般爲模塊文件名,不帶路徑或者文件擴展名。
# 可是您也能夠像一個標準的程序樣直接運行模塊,
# 在這種狀況下, __name__ 的值將是一個特別缺省"__main__"。

# debug=True 調試模式開啓

一個完整的程序

hello.py: 一個完整的Flask程序

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程序

from flask import Flask
app = Flask(__name__)

@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__'
    app.run(debug=True)
    
# 定義了動態路由/user/<name>

運行結果以下:
session

請求-響應循環

程序和請求上下文

請求對象封裝了客戶端發送的HTTP請求。
將請求對象做爲參數傳入視圖函數,視圖函數便可訪問請求對象。app

from flask import request

@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')
    return '<p>Your browser is %s</p>' % user_agent

Flask上下文全局變量框架

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

程序上下文使用方法:ide

>>> from hello import app
>>> from flask import current_app
>>> current_app.name
Traceback(most recent call last):
...
RuntimeError:working outside of application context
>>> app_ctx = app.app_context()
>>> app_ctx.push()
>>> current_app.name
'hello'
>>> app_ctx.pop()
# app.app_context()可得到一個程序上下文

請求調度

URL映射中的HEAD、Options、GET是請求方法,由路由進行處理。
不一樣的請求方法發送到相同的URL上時,會使用不一樣的視圖函數進行處理。

請求鉤子

Flask支持如下4種鉤子:

  • before_first_request:註冊一個函數,在處理第一個請求以前運行。

  • before_request:註冊一個函數,在每次請求以前運行。

  • after_request:註冊一個函數,若是沒有未處理的異常拋出,也在每次請求以後運行。

  • teardown_request:註冊一個函數,即便有未處理的異常拋出,也在每次請求以後運行。

響應

建立響應對象並設置Cookie

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

重定向

from flask import redirect

@app.route('/')
def index():
    return redirect('http://www.example.com')

錯誤處理

from flask import abort

@app.route('/user/<id>')
def get_user(id):
    user = load_user(id)
    if not user:
        abort(404)
    return '<h1>Hello, %s</h1>' % user.name

Flask擴展

Flask被設計爲可擴展模式,一些重要功能是用安裝包的形式增長。

使用Flask-Script支持命令行選項

(venv)$pip install flask-script

hello.py:使用Flask-Script

from flask_script import Manager
manager = Manager(app)
# ...
if __name__ == '__main__':
    manager.run()

運行Python程序: python hello.py runserver
web服務器可以使用http://a.b.c.d:5000/ 網絡中的任一臺電腦進行訪問,其中'a.b.c.d'是服務器所在計算機的外網的IP地址。
Python hello.py runserver --host 0.0.0.0


本文由 EverFighting 創做,採用 知識共享署名 3.0 中國大陸許可協議 進行許可。

相關文章
相關標籤/搜索