運行flask程序

基本flask代碼
form flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
app.run(debug=True)
url_map 可以將裝飾器路由和視圖的對應關系保存起來

初始化所用的參數
- import_name: 模塊名
- static_url_path: 靜態文件訪問前綴
- static_folder: 默認‘static’
- template_folder: 默認‘templates’
app = Flask(__name__,
static_url_path='/python', # 靜態文件的前綴
static_folder='static', # 靜態文件所處於的文件夾
template_folder='templates' # 模塊文件所處於的文件夾
)
配置參數 app.config
- app.config.from_pyfile(“yourconfig.cfg”)
- app.config.from_object()
直接指定某個名字的配置信息
app.config['DEBUG'] = True
讀取配置參數
- app.config.get()
- 在視圖中 current_app.config.get()
app.run 的參數
- app.run(host=”0.0.0.0”, port=5000, debug = True)
路由的定義
使用methods參數可以指定可接受的請求方式
@app.route('/',methods=['GET','POST'])
def
hello():
return
'<h1>hello world</h1>'
如果同一路由指向兩個不同的函數,在匹配過程中至上而下一次匹配

上面的例子的輸出結果就是hello函數的結果
路由傳遞的參數默認當做string處理,可以指定類型
@app.route('/user/<int:id>')
def
hello_python(id):
return
'hello python %d' %id
重定向的實例
@app.route('/redirect')
def demo4():
# url_for:取到指定視圖函數對應的路由路徑
# return redirect(url_for('demo2'))
return redirect(url_for('demo3',order_id='19292')
返回JSON
@app.route('/json')
def demo5():
json_dict = {
"name": "nick",
"age": 18
}
return json.dumps(json_dict)
# return jsonify(json_dict)
json.dumps 和jsonify的區別


返回狀態碼的兩種方式(abort只會拋出符合http協議的異常狀態碼,用於手動拋出異常)
@app.route('/status_code')
def demo6():
a = 1 / 0
return "status_code", 666
@app.route('/abort')
def demo7():
# 使用 abort 去主動拋出HTTP的異常
abort(404)
return 'aa'
使用errorhandler捕獲異常和HTTP的狀態碼
@app.errorhandler(ZeroDivisionError)
def not_found(e):
return u'除以0了 %s' % e
自定義正則匹配轉換
導入轉換器包
from
werkzeug.routing import BaseConverter
自定義轉換器
class RegexConverter(BaseConverter):
# 定義轉換器的規則,regex是父類的屬性,重寫父類的屬性
# regex = '[0-9]{5}'
def __init__(self, url_map, *args):
# 調用super
super(RegexConverter, self).__init__(url_map)
# 將參數中的正則表達式提取出來保存到當前類的regex屬性上
self.regex = args[0]
# 當匹配完成之后,在調用具體的視圖函數之前,會調用些方法將匹配結果傳入
# 做最后一處理
def to_python(self, value):
print value
return int(value)
# return u'哈哈'
# 在匹配之前會被執行,執行的時候會把參數傳入,不關心參數是否符合匹配規則
# 而這個方法返回了之后才會做真正的路由匹配
# 在匹配之前做一些數據處理操作,比如說URL編碼的操作
def to_url(self, value):
return value
將自定義的轉換器添加到默認的轉換器列表中
app.url_map.converters['re'] = RegexConverter
自帶的轉換器
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
request對象常用屬性
屬性 | 說明 | 類型 |
data | 記錄請求的數據,並轉換為字符串 | * |
form | 記錄請求中的表單數據 | MultiDict |
args | 記錄請求中的查詢參數 | MultiDict |
cookies | 記錄請求中的cookie信息 | Dict |
headers | 記錄請求中的報文頭 | EnvironHeaders |
method | 記錄請求使用的HTTP方法 | GET/POST |
url | 記錄請求的URL地址 | string |
files | 記錄請求上傳的文件 | * |
使用終端運行flask程序
# 導入相關包
from flask_script import Manager
# 將當前app與manager關聯起來
manager = Manager(app)
運行
manager.run()
終端指令 python 文件名.py runserver -h 運行ip地址:端口號(ip地址和端口號為選填,默認為127.0.0.1:5000)
藍圖(Blueprint):
簡單來說,Blueprint 是一個存儲操作方法的容器,這些操作在這個Blueprint 被注冊到一個應用之后就可以被調用,Flask 可以通過Blueprint來組織URL以及處理請求。
blueprint具有的屬性:
- 一個應用可以具有多個Blueprint
- 可以將一個Blueprint注冊到任何一個未使用的URL下比如 “/”、“/sample”或者子域名
- 在一個應用中,一個模塊可以注冊多次
- Blueprint可以單獨具有自己的模板、靜態文件或者其它的通用操作方法,它並不是必須要實現應用的視圖和函數的
- 在一個應用初始化時,就應該要注冊需要使用的Blueprint
使用藍圖三步走:
- 創建一個藍圖對象
admin=Blueprint('admin',__name__)
- 在這個藍圖對象上進行操作,注冊路由,指定靜態文件夾,注冊模板過濾器
@admin.route('/')
def
admin_home():
return
'admin_home'
- 在應用對象上注冊這個藍圖對象
app.register_blueprint(admin,url\_prefix='/admin')
運行機制
- 藍圖是保存了一組將來可以在應用對象上執行的操作,注冊路由就是一種操作
- 當在應用對象上調用 route 裝飾器注冊路由時,這個操作將修改對象的url_map路由表
- 然而,藍圖對象根本沒有路由表,當我們在藍圖對象上調用route裝飾器注冊路由時,它只是在內部的一個延遲操作記錄列表defered_functions中添加了一個項
- 當執行應用對象的 register_blueprint() 方法時,應用對象將從藍圖對象的 defered_functions 列表中取出每一項,並以自身作為參數執行該匿名函數,即調用應用對象的 add_url_rule() 方法,這將真正的修改應用對象的路由表
藍圖的url前綴
- 當我們在應用對象上注冊一個藍圖時,可以指定一個url_prefix關鍵字參數(這個參數默認是/)
- 在應用最終的路由表 url_map中,在藍圖上注冊的路由URL自動被加上了這個前綴,這個可以保證在多個藍圖中使用相同的URL規則而不會最終引起沖突,只要在注冊藍圖時將不同的藍圖掛接到不同的自路徑即可
- url_for
url_for('admin.index') # /admin
注冊靜態路由
和應用對象不同,藍圖對象創建時不會默認注冊靜態目錄的路由。需要我們在 創建時指定 static_folder 參數。
下面的示例將藍圖所在目錄下的static_admin目錄設置為靜態目錄
admin = Blueprint("admin",__name__,static_folder='static_admin')app.register_blueprint(admin,url_prefix='/admin'
現在就可以使用/admin/static_admin/ 訪問static_admin目錄下的靜態文件了 定制靜態目錄URL規則 :可以在創建藍圖對象時使用 static_url_path 來改變靜態目錄的路由。下面的示例將為static_admin文件夾的路由設置為 /lib
admin = Blueprint("admin",__name__,static_folder='static_admin',static_url_path='/lib')app.register_blueprint(admin,url_prefix='/admin'
設置模版目錄
藍圖對象默認的模板目錄為系統的模版目錄,可以在創建藍圖對象時使用 template_folder 關鍵字參數設置模板目錄
admin = Blueprint('admin',__name__,template_folder='my_templates'
注:如果在templates中存在和my_templates同名文件,則系統會優先使用templates中的文件,在使用templates目錄同名的情況下,需要通過路徑區分,例如:
my_templates存在兩個,若使用admin目錄下的my_templates目錄,則需要使用如下方式注冊:
admin = Blueprint('admin',__name__,template_folder='admin/my_templates'
單元測試:
斷言就是判斷一個函數或對象的一個方法所產生的結果是否符合你期望的那個結果。 python中assert斷言是聲明布爾值為真的判定,如果表達式為假會發生異常。單元測試中,一般使用assert來斷言結果。

常用的斷言方法:
assertEqual 如果兩個值相等,則passassertNotEqual 如果兩個值不相等,則passassertTrue 判斷bool值為True,則passassertFalse 判斷bool值為False,則passassertIsNone 不存在,則passassertIsNotNone 存在,則pas
單元測試准備工作
# 開啟測試模式,如果被測試的代碼有錯誤,會提示被測試的代碼哪個位置出錯
app.testing = True
# 可以直接通過該客戶端返回指定地址發起請求
self.client = app.test_client()
單元測試案例的方法要以 `test` 開頭