Flask 高效開發實戰-flask1
在模板渲染中,使用Markup轉換變量中的特殊字符
from flask import Markup
Markup函數對字符串進行轉移處理再傳遞給render_template()函數
在瀏覽器中顯示標簽代碼
路由地址的反響生成
通過函數名獲得與其綁定的Url地址
需要使用url_for函數進行反向解析
with app.text_request_context() print(url_for(‘f_root‘)) # 輸出:/
app.text_request_context()方法告訴解釋器為在其作用域中的代碼模擬一個HTTP請求上下文,使其好像被一個HTTP請求所調用
使用Context上下文
他是服務器端獲得應用及請求相關信息的對象
1、會話上下文
會話(session)是一種客戶端與服務器端保持狀態的解決方案,會話上下文是用來實現這種解決方案的存儲結構
from flask import Flask,session from datetime import datetime app = Flask(__name__) app.secret_key = ‘SET_ME_BEFORE_USE_SESSION‘ @app.route(‘/‘) def hello_world(): return ‘Hello World!‘ @app.route(‘/write_session‘) def wirteSession(): session[‘key_time‘]=datetime.now().strftime(‘%Y-%m-%d %H:%M:%S‘)# 將當前時間保存在Session中 return session[‘key_time‘] # 返回當前時間 @app.route(‘/read_session‘) def readSession(): return session.get(‘key_time‘)# 獲取上次調用wirteSession時寫入的時間並返回
除了正常的數據保存和讀取,flask.session對象還維護自身的狀態,通過
new 判斷本次請求的Session是否時新建的
modified 判斷本次請求中是否修改過Session鍵值
@app.route(‘/write_session‘) def wirteSession(): session[‘key_time‘]=time.time() # 將當前時間保存在Session中 return session.modified # 因為之前進行了Session設置,所以判斷本次請求是否被修改過(modified)返回TRUE
應用全局對象
from flask import Flask,g class MYDB(): def __init__(self): print(‘一個數據庫鏈接已經建立‘) def close(self): print(‘數據庫已經關閉‘) def connect_to_database(): return MYDB() def get_db(): db = getattr(g,‘_database‘,None) if db is None: db = connect_to_database() g._database = db # 存入Flask.g對象中 return db @app.teardown_request # 在請求結束時自動被Flask框架調用 def teardown_db(response): db = getattr(g,‘_database‘,None)# 從Flask.g對象中獲取對象,檢查是否有鏈接數據庫對象,如果有則關閉 if db is not None: db.close()
可以在請求處理函數的任何地方調用get_db()
class MYDB(): def __init__(self): print(‘一個數據庫鏈接已經建立‘) def close(self): print(‘數據庫已經關閉‘) def connect_to_database(): return MYDB() def get_db(): db = getattr(g,‘_database‘,None) if db is None: db = connect_to_database() g._database = db # 存入Flask.g對象中 return db @app.teardown_request def teardown_db(response): db = getattr(g,‘_database‘,None)# 從Flask.g對象中獲取對象 if db is not None: db.close() def login(): db=get_db() # 第一次調用getdb 創建數據庫鏈接 session[‘has_login‘]=True # 使用db檢查數據庫中的用戶名和密碼 def view_list(): if ‘has_login‘ not in session: login() db = get_db() # 第二次調用get_db()# 直接復用之前建立的鏈接 # 使用db 從數據庫查詢數據,返回teardown_db()將會被自動調用
請求上下文
主要是在服務端獲得從客戶端提交的數據,包括url參數,表單數據,cookies等
from flask import Flask,request,url_for,redirect app = Flask(__name__) @app.route(‘/redirect_url‘) def redirect_url(): next = request.args.get(‘next‘) or url_for(‘index‘) return redirect(next) @app.route(‘/echo_url‘) def echo_url(): return request.base_url
request的屬性
下面是request可使用的屬性,其中黑體是比較常用的。
-
form
一個從POST和PUT請求解析的 MultiDict(一鍵多值字典)。 -
args
MultiDict,要操作 URL (如 ?key=value )中提交的參數可以使用 args 屬性:
searchword = request.args.get(‘key‘, ‘‘)
-
values
CombinedMultiDict,內容是form
和args
。
可以使用values替代form和args。 -
cookies
顧名思義,請求的cookies,類型是dict。 -
stream
在可知的mimetype下,如果進來的表單數據無法解碼,會沒有任何改動的保存到這個·stream·以供使用。很多時候,當請求的數據轉換為string時,使用data
是最好的方式。這個stream只返回數據一次。 -
headers
請求頭,字典類型。 -
data
包含了請求的數據,並轉換為字符串,除非是一個Flask無法處理的mimetype。 -
files
MultiDict,帶有通過POST或PUT請求上傳的文件。 -
environ
WSGI隱含的環境配置。 -
method
請求方法,比如POST、GET。 -
path
- script_root
- url
- base_url
- url_root
如果用戶請求如下URL:http://www.example.com/myapplication/page.html?x=y
以上的參數內容如下:
名稱 | 內容 |
---|---|
path | /page.html |
script_root | /myapplication |
base_url | http://www.example.com/myapplication/page.html |
url | http://www.example.com/myapplication/page.html?x=y |
url_root | http://www.example.com/myapplication/ |
-
is_xhr
如果請求是一個來自JavaScript XMLHttpRequest
的觸發,則返回True
,這個只工作在支持X-Requested-With
頭的庫並且設置了XMLHttpRequest
。 -
blurprint
藍本名字。 -
endpoint
endpoint匹配請求,這個與view_args
相結合,可是用於重構相同或修改URL。當匹配的時候發生異常,會返回None。 -
get_json(force=False, silent=False, cache=True)
-
json
如果mimetype
是application/json
,這個參數將會解析JSON數據,如果不是則返回None。
可以使用這個替代get_json()方法。 -
max_content_length
只讀,返回MAX_CONTENT_LENGTH
的配置鍵。 -
module
如果請求是發送到一個實際的模塊,則該參數返回當前模塊的名稱。這是棄用的功能,使用blueprints
替代。 - on_json_loading_failed(e)
-
routing_exception = None
如果匹配URL失敗,這個異常將會/已經拋出作為請求處理的一部分。這通常用於NotFound
異常或類似的情況。 -
url_rule = None
內部規則匹配請求的URL。這可用於在URL之前/之後檢查方法是否允許(request.url_rule.methods) 等等。
默認情況下,在處理請求函數中寫下print(‘request.url_rule.methods‘, request.url_rule.methods)
會打印:request.url_rule.methods {‘GET’, ‘OPTIONS’, ‘HEAD’}
-
view_args = None
一個匹配請求的view參數的字典,當匹配的時候發生異常,會返回None。
Flask 高效開發實戰-flask1