本系列筆記是我閱讀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服務器。服務器
route裝飾器 :可使用Flask應用實例的route裝飾器將一個URL規則綁定到一個視圖函數上。
下面程序中route裝飾器將根目錄綁定在index視圖上。cookie
@app.route('/') def index(): return '<h1>Hello World!</h1>'
@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 調試模式開啓
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>Hello World!</h1>' if __name__ == '__main__' app.run(debug=True)
運行結果以下:網絡
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:註冊一個函數,即便有未處理的異常拋出,也在每次請求以後運行。
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被設計爲可擴展模式,一些重要功能是用安裝包的形式增長。
(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 中國大陸許可協議 進行許可。