Hello Flask
Hello Flask
Flask簡介

Flask是一個使用Python編寫的輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask使用BSD授權。
Flask被稱為“microframework”,因為它使用簡單的核心,用extension增加其他功能。Flask沒有預設使用的資料庫、窗體驗證工具。然而,Flask保留了擴增的彈性,可以用Flask-extension加入這些功能:ORM、窗體驗證工具、檔案上傳、各種開放式身份驗證技術。
Flask英文翻譯為瓶子,燒瓶,與另一個web框架Bottle同義,意在表示另一種容器,另一個框架。而且他們兩個也有一些相似的地方。
第一個Flask程式
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>Hello,Flask<h1/>' app.run('127.0.0.1',8000)
執行後可見控制檯輸出:
- Serving Flask app “hello” (lazy loading)
- 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:8000/ (Press CTRL+C to quit)
- Environment: production
URL路由
Flask路由採用裝飾器的方式
@app.route('/') def index():
繫結多個路由
@app.route('/index') @app.route('/') def index():
動態路由
@app.route('/index/<name>') def index(name):
name會作為引數傳入檢視函式
也可以為引數設定預設值:
@app.route('/index',defaults={'name':'sfencs'}) @app.route('/index/<name>') def index(name):
它其實相當於
@app.route('/index') @app.route('/index/<name>') def index(name='sfencs'):
還可以指定引數的型別:
@app.route('/index/<int:num>') def index(num):
這樣路由只會匹配index後是數值型別引數的url,並且還會把num轉換為int型
除了int之外還有path,string,float,any,uuid等
指定請求方式的路由
@app.route('/index/<int:num>',methods=['get']) def index(num):
method引數是一個列表
使用url_for()獲取url
當檢視函式繫結的路由傳送改變時,我們可能在其他使用該路徑的地方一個一個手動修改,這種硬編碼的方式降低了程式碼的易用性,這種情況可以使用url_for()函式來獲取url
url_for()函式的引數為檢視函式名
例如
@app.route('/index') def aaa():
那麼url_for(’aaa‘)就是’/index’
當然如果是有引數的路由,那麼需要在url_for()函式中傳入引數
例如
@app.route('/index/<int:num>') def aaa(num):
url_for函式就應該寫為:url_for(‘aaa’,num=123)
url_for()函式預設生成的是相對URL,要想生成絕對URL需要加入引數_external=True
http請求與響應
請求
如何在檢視函式中獲取請求,首先需要引入request物件
from flask import Flask,request
在檢視函式中可以直接通過request獲得屬性或方法
舉個簡單的例子
@app.route('/index/<int:num>',methods=['get']) def index(num): print(request.method) print(request.args.get('name','sfencs')) return '<h1>Hello,Flask<h1/>'
request中的方法和屬性未來都會對我們很有用,這裡就不一一介紹了。
響應
1.普通響應
return '<h1>Hello,Flask<h1/>' return '<h1>Hello,Flask<h1/>',200#可以設定狀態碼
2.重定向
return redirect(url_for('index'))
3.錯誤響應
abort(404)
abort()函式直接返回錯誤響應,後面的程式碼不再執行
4.返回響應物件
response = make_response('<h1>Hello,Flask<h1/>') response.mimetype = 'text/html' return response
通過設定mimetype可以返回不同型別的資料,常用的有純文字,html,xml,json
返回json格式資料時Flask提供一種更簡潔的方式
return jsonify({'name':'sfencs'})
這一個東西把生成response物件,設定資料型別,json序列化都做完了。
請求鉤子
請求鉤子是在檢視函式處理請求的前或者後的階段進行的處理函式
Flask預設實現的五種請求鉤子:
- before_first_request 處理第一個請求之前
- before_request 處理請求之前
- after_request 處理請求之後
- after_this_request 在檢視函式內註冊一個函式,會在這個請求結束後執行
- teardown_request 在請求結束後,如果有異常也會執行的鉤子,它在所有鉤子中最後一個執行,需要傳入異常物件
鉤子通過裝飾器註冊,比如
@app.before_request def func(): pass
after_request和after_this_request的鉤子必須接受一個響應類物件做引數,最後並將其返回
配置變數
Flask中,配置變數通過Flask物件的config屬性配置與獲取
在Flask物件的原始碼中看到config中已經儲存了很多預設值
default_config = ImmutableDict({ 'ENV':None, 'DEBUG':None, 'TESTING':False, 'PROPAGATE_EXCEPTIONS':None, 'PRESERVE_CONTEXT_ON_EXCEPTION':None, 'SECRET_KEY':None, 'PERMANENT_SESSION_LIFETIME':timedelta(days=31), 'USE_X_SENDFILE':False, 'SERVER_NAME':None, 'APPLICATION_ROOT':'/', 'SESSION_COOKIE_NAME':'session', 'SESSION_COOKIE_DOMAIN':None, 'SESSION_COOKIE_PATH':None, 'SESSION_COOKIE_HTTPONLY':True, 'SESSION_COOKIE_SECURE':False, 'SESSION_COOKIE_SAMESITE':None, 'SESSION_REFRESH_EACH_REQUEST':True, 'MAX_CONTENT_LENGTH':None, 'SEND_FILE_MAX_AGE_DEFAULT':timedelta(hours=12), 'TRAP_BAD_REQUEST_ERRORS':None, 'TRAP_HTTP_EXCEPTIONS':False, 'EXPLAIN_TEMPLATE_LOADING':False, 'PREFERRED_URL_SCHEME':'http', 'JSON_AS_ASCII':True, 'JSON_SORT_KEYS':True, 'JSONIFY_PRETTYPRINT_REGULAR':False, 'JSONIFY_MIMETYPE':'application/json', 'TEMPLATES_AUTO_RELOAD':None, 'MAX_COOKIE_SIZE': 4093, })
它其實是字典的子類,所以我們可以以字典的方式操作它
app.config['SWITCH'] = 'on' print(app.config['SWITCH'])
也可以使用update方法一次新增多個配置
app.config.update(SWITCH_A=True,SWITCH_B=False)
最後要注意配置變數的名稱必須要大寫,小寫的變數不會被讀取
debug模式
如執行時控制檯的輸出
- Debug mode: off
可知預設debug模式是關閉的,所以當訪問路徑的程式出現錯誤的時候頁面會顯示

若要開啟debug模式,可在run方法新增debug=True引數
app.run('127.0.0.1',8000,debug=True)
此時我們故意使程式出錯,即將檢視函式多新增一個引數,再次訪問url,會出現

這個頁面對於我們除錯錯誤非常有用,同時還允許我們在頁面上執行Python程式碼,我們只需要點選錯誤最右邊的命令列圖示
這時會彈出一個視窗讓我們輸入PIN碼,這個可以在程式剛允許時控制檯輸出找到

輸入後就可在頁面執行程式碼了
