1. 程式人生 > >Flask 高效開發實戰-flask1

Flask 高效開發實戰-flask1

ftime clas 自動 應用 odi led 服務端 文件 hello

在模板渲染中,使用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,內容是formargs
    可以使用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
      如果mimetypeapplication/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