Flask簡介 Flask是用 Python 語言基於 Werkzeug 工具箱編寫的輕量級Web開發框架。 其 WSGI 工具箱採用 Werkzeug(路由模塊),模板引擎則使用 Jinja2。這兩個也是 Flask 框架的核心。 搭建虛擬環境(Ubuntu) 一、安裝虛擬環境命令: 二、創建虛擬 ...
Flask簡介
其 WSGI 工具箱採用 Werkzeug(路由模塊),模板引擎則使用 Jinja2。這兩個也是 Flask 框架的核心。
搭建虛擬環境(Ubuntu)
一、安裝虛擬環境命令:
1、sudo pip install virtualenv
2、sudo pip install virtualenvwrapper
二、創建虛擬環境命令(需聯網):
在python3中,創建虛擬環境(python2創建則不需要 -p python3):
mkvirtualenv -p python3 虛擬環境名稱
三、使用虛擬環境:
1、查看虛擬環境的命令:workon 兩次tab鍵
2、使用虛擬環境的命令:workon 虛擬環境名稱
3、退出虛擬環境的命令:deactivate
4、刪除虛擬環境的命令(先退出虛擬環境):rmvirtualenv 虛擬環境名稱
5、在虛擬環境中安裝工具包:pip install 包名稱
例:安裝flask-0.10.1的包 :pip install flask==0.10.1
6、查看虛擬環境中安裝的包:pip freeze
1 # 導入Flask模塊 2 from flask import Flask 3 4 5 # 創建app實例 6 app = Flask(__name__) 7 8 9 # 通過裝飾器路由,把url與視圖函數綁定起來 10 @app.route('/') 11 def index(): 12 return 'hello word!' 13 14 15 if __name__ == '__main__': 16 # 運行當前Flask應用程式 17 app.run()Hello Word
1 app = Flask(__name__, # import_name是 Flask 程式所在的包(模塊),傳__name__就可以。其可以決定 Flask 在訪問靜態文件時查找的路徑 2 # static_path='static', 已廢棄(用static_url_path代替) 3 static_url_path='/static', # 靜態文件訪問路徑,可以不傳,預設為:/ + static_folder 4 static_folder='static', # 靜態文件存儲的文件夾,可以不傳,預設為 static 5 template_folder='templates' # 模板文件存儲的文件夾,可以不傳,預設為 templates 6 )View Code
class Config(object): DEBUG = True app.config.from_object(Config)
2、從配置文件中載入:
app.config.form_pyfile('配置文件名')
3、從環境變數中載入:
app.config.from_envvar('環境變數名稱')
app.config.get() # 在視圖函數中使用 current_app.config.get()
app.run(host="0.0.0.0", port=5000, debug = True)
參考代碼:
# 路由傳遞參數 @app.route('/user/<user_id>', methods=['GET', 'POST']) # methods給路由添加請求方式 def user_info(user_id): return 'hello %s %s' % (user_id, request.method)
# 路由傳遞的參數預設當做 string 處理,也可以指定參數的類型@app.route('/user/<int:user_id>')
1 from flask import Flask, jsonify 2 from flask import json 3 4 app = Flask(__name__) 5 6 7 @app.route('/') 8 def index(): 9 return 'index' 10 11 12 @app.route('/demo2') 13 def demo2(): 14 json_dict = { 15 "name": "wenwang", 16 "age": 18 17 } 18 # 使用json.dumps將字典轉成JSON字元串 19 # result = json.dumps(json_dict) 20 # 使用json.loads將JSON字元串轉成字典 21 # test_dict = json.loads('{"age": 18, "name": "wenwang"}') 22 # return result 23 24 # TODO jsonify會指定響應內容數據的格式(告訴客戶端我返回給你的數據格式是什麼) 25 return jsonify(json_dict) 26 27 if __name__ == '__main__': 28 app.run(debug=True)View Code
# 重定向 @app.route('/demo1') def demo1(): return redirect('http://www.baidu.com')
例2、重定向到視圖函數
1 # 路由傳遞參數 2 @app.route('/user/<int:user_id>') 3 def user_info(user_id): 4 return 'hello %d' % user_id 5 6 # 重定向 7 @app.route('/demo2') 8 def demo2(): 9 # 使用 url_for 生成指定視圖函數所對應的 url 10 return redirect(url_for('user_info', user_id=100))View Code
@app.route('/demo6') def demo6(): return '狀態碼為 666', 666 # 666就為自定義狀態碼
1 from flask import Flask 2 from flask import redirect 3 from flask import url_for 4 from werkzeug.routing import BaseConverter 5 6 7 class RegexConverter(BaseConverter): 8 """自定義正則的轉換器""" 9 # regex = '[0-9]{6}' 10 11 def __init__(self, url_map, *args): 12 super(RegexConverter, self).__init__(url_map) 13 # 取到第1個參數,給regex屬性賦值 14 self.regex = args[0] 15 16 17 class ListConverter(BaseConverter): 18 regex = "(\\d+,?)+\\d$" 19 20 def to_python(self, value): 21 """當匹配到參數之後,對參數做進一步處理之後,再返回給視圖函數中""" 22 return value.split(',') 23 24 def to_url(self, value): 25 """使用url_for的時候,對視圖函數傳的參數進行處理,處理完畢之後以便能夠進行路由匹配""" 26 result = ','.join(str(v) for v in value) 27 return result 28 29 30 app = Flask(__name__) 31 # 將自己的轉換器添加到預設的轉化器列表中 32 app.url_map.converters['re'] = RegexConverter 33 app.url_map.converters['list'] = ListConverter 34 35 36 @app.route('/') 37 def index(): 38 return 'index' 39 40 # 自定義轉換器 41 # @app.route('/user/<re:user_id>') 42 @app.route('/user/<re("[0-9]{6}"):user_id>') 43 def demo1(user_id): 44 return '用戶的id是 %s' % user_id 45 46 47 @app.route('/users/<list:user_ids>') 48 def demo2(user_ids): 49 return '用戶的id是 %s' % user_ids 50 51 52 @app.route('/demo3') 53 def demo3(): 54 return redirect(url_for('demo2', user_ids=[1, 3, 4, 5])) 55 56 57 if __name__ == '__main__': 58 app.run(debug=True)View Code
abort(404)
@app.errorhandler(404) def internal_server_error(e): return '網址找不到了'
捕獲指定異常
@app.errorhandler(ZeroDivisionError) # 捕獲除數不能為0的異常 def zero_division_error(e): return '除數不能為0'
請求鉤子( before_request ,after_request )
為了讓每個視圖函數避免編寫重覆功能的代碼,Flask提供了通用設施的功能,即請求鉤子。
請求鉤子是通過裝飾器的形式實現,Flask支持如下四種請求鉤子:
1、before_first_request
-
- 在處理第一個請求前執行
2、before_request
-
- 在每次請求前執行
- 如果在某修飾的函數中返回了一個響應,視圖函數將不再被調用
3、after_request
-
- 如果沒有拋出錯誤,在每次請求後執行
- 接受一個參數:視圖函數作出的響應
- 在此函數中可以對響應值在返回之前做最後一步修改處理
- 需要將參數中的響應在此參數中進行返回
4、teardown_request
-
- 在每次請求後執行
- 接受一個參數:錯誤信息,如果有相關錯誤拋出
測試代碼:
1 from flask import Flask 2 3 app = Flask(__name__) 4 5 6 @app.before_first_request 7 def before_first_request(): 8 """在第一次請求之前會訪問該函數""" 9 print('before_first_request') 10 11 12 @app.before_request 13 def before_request(): 14 """在每次請求之前都會調用""" 15 print('before_request') 16 # 可以對一些的請求進行阻止 17 18 19 @app.after_request 20 def after_request(response): 21 """在請求之後會調用,並且函數裡面接受一個參數:響應,還需要將響應進行返回""" 22 print('after_request') 23 # 可以在此函數中對響應數據做統一的處理 24 return response 25 26 27 @app.teardown_request 28 def teardown_request(error): 29 """在請求之後會執行,如果請求的函數報有異常,會把具體異常傳入到此函數""" 30 print('teardown_request') 31 32 33 @app.route('/') 34 def index(): 35 return 'index' 36 37 38 if __name__ == '__main__': 39 app.run(debug=True)View Code