1. 程式人生 > >Flask:02-秒懂Flask會話控制與模板引擎

Flask:02-秒懂Flask會話控制與模板引擎

會話控制原理

  • 說明:概念百度說明的很詳細,請自行百度
  • 說明:

    由於HTTP協議無狀態無連線的特點,導致一個使用者在同一網站做連續操作時,需要不斷的提供身份資訊;為了解決這個問題,我們可以通過cookie攜帶特定的資訊加以解決。當首次訪問網站時設定cookie資訊,以後每次再訪問該網站時,瀏覽器會自動攜帶cookie資訊。

  • 使用:

    from flask import Blueprint, request, make_response
    
    cookie = Blueprint('cookie', __name__, url_prefix='/cookie')
    
    # 獲取
    @cookie.route('/get/')
    def get_cookie(): return request.cookies.get('name', '猴哥是我') # 設定 @cookie.route('/set/') def set_cookie(): resp = make_response('cookie已設定') # 設定cookie,預設有效期為瀏覽器關閉 # expires:有效期,是一個datetime型別的引數 # max_age:有效期,是一個int型別的引數,推薦使用 resp.set_cookie('name', '八戒', max_age=10) return
    resp # 刪除 @cookie.route('/del/') def del_cookie(): resp = make_response('cookie已刪除') # 刪除cookie,其實是設定cookie立即失效 resp.delete_cookie('name') return resp

session

  • 說明:

    session是一種比cookie更加安全的攜帶資訊的方案,功能與cookie相同。

  • 分類:

    • server side session:資料存放在伺服器上,客戶端儲存的是seesion_id(通過cookie傳輸)
    • client side session:將session資料加密編碼,然後儲存到客戶端,flask預設採用的就是這種方案
  • 使用:

    from flask import Blueprint, session
    
    sess = Blueprint('sess', __name__, url_prefix='/session')
    
    # 獲取
    @sess.route('/get/')
    def get_session():
        return session.get('name', 'who are you?')
    
    # 設定
    @sess.route('/set/')
    def set_session():
        # 設定有效期,預設瀏覽器關閉即失效
        # 設定為True,session有效期為永久
        # 永久的時間由PERMANENT_SESSION_LIFETIME配置選項決定,預設31天
        session.permanent = True
        session['name'] = 'cuihua'
        return 'session已設定'
    
    # 刪除
    @sess.route('/del/')
    def del_session():
        # 刪除指定的session,第二個引數設定為None,session不存在也不報錯
        # session.pop('name', None)
        # 清空session
        session.clear()
        return 'session已刪除'
    

flask-session

  • 說明:將session資料儲存到伺服器的解決方案。

  • 安裝:pip install flask-session

  • 使用:

    from flask import Flask, session
    from flask_script import Manager
    from redis import Redis
    from flask_session import Session
    
    app = Flask(name)
    app.config['SECRET_KEY'] = '123456'
    app.config['SESSION_TYPE'] = 'redis'
    app.config['SESSION_REDIS'] = Redis()
    manager = Manager(app)
    sess = Session(app)
    # 可以通過兩步進行初始化
    # sess.init_app(app)
    
    @app.route('/')
    def index():
        return 'flask-session'
    
    @app.route('/get/')
    def get_session():
        return session.get('name', '你是誰?')
    
    @app.route('/set/')
    def set_session():
        session['name'] = 'houge'
          return 'session已設定'
    
    if __name__ == '__main__':
         manager.run()
    

模板引擎

  • 說明:

    模板檔案就是安裝特定的語法規則書寫的負責展示效果的HTML檔案;模板引擎就是提供這種特定規則替換和解析的工具。

  • Jinja2:

    在flask中採用的時Jinja2的模板引擎,它是由flask核心開發組人員開發的。

Jinja2語法

  • 目錄結構

    project/        # 工程目錄
        manage.py        # 啟動控制檔案
        templates/        # 模板檔案目錄
    
  • 模板渲染

    • templates目錄下建立一個模板檔案index.html,在其中寫入頁面內容
    • 在檢視函式中渲染模板:render_template('index.html')
    • 渲染模板字串:render_template_string('<h1>渲染模板字串</h1>')
    • 設定模板檔案自動載入:app.config['TEMPLATES_AUTO_RELOAD'] = True,除錯模式會自動載入
  • 使用變數

    • 需要解析的變數需要放在{{ }}
    • 渲染模板檔案時需要傳遞相關變數:render_template('var.html', name='goudan')
    • 註釋寫在{# #}
  • 使用過濾器

    • 說明:過濾器就是對要解析的變數進行特定的處理,然後再輸出。
    • 使用:{{ 變數|過濾器 }},如:{{ name|upper }},就是將name轉換為全大寫輸出
    • 常用過濾器:

    | 過濾器 | 說明 || ————— | —————————————- || upper | 全大寫 || lower | 全小寫 || title | 每個單詞首字母大寫 || capitalize | 首字母大寫 || trim | 去掉兩邊的空白 || striptags | 過濾HTML標籤 || safe | 渲染時不轉義(預設全部轉義),只能使用在信任的變數渲染 |

    • 動態開啟關閉渲染轉義
    {# 動態開啟關閉轉義 #}
    {% autoescape False %}
    <div>{{ user }}</div>
    {% endautoescape %}
    
  • 流程控制

    {% if name %}
        <h1>Hello {{ name }}!</h1>
    {% else %}
        <h1>Hello World!</h1>
    {% endif %}
    
    <ol>
        {% for i in range(5) %}
            <li>{{ i }}</li>
        {% endfor %}
    </ol>
    
  • 檔案包含

    • 說明:

      當有多處相同的顯示效果出現時,將內容單獨提取出來,需要的地方直接包含進來即可。包含另一個檔案,相當將其中的內容直接貼上過來,避免了大量重複書寫(複製貼上)

    • 使用:{% include 'include2.html' %}

  • 巨集的使用

    • 定義巨集:{% macro 巨集名(引數) %}巨集內容{% endmacro %}
    • 呼叫巨集:{{ 巨集名(引數) }}
    • 匯入巨集:{% from '巨集所在檔案' import 巨集名 %}
    • 說明:巨集採用了類似於python中的函式進行定義和呼叫,可以減少程式碼的重複書寫,而且比較靈活。
  • 模板繼承

    • 說明:當一個網站的多個頁面都很相似,只有細微的差別,可以通過模板繼承減少重複書寫。

    • 使用:

      • parents.html
      <html>
      <head>
          <meta charset="UTF-8">
          <title>{% block title %}基礎模板標題{% endblock %}</title>
      </head>
      <body>
          {% block body %}<div>預設內容</div>{% endblock %}
      </body>
      </html>
      
      • children.html
      {# 繼承自另一個模板 #}
      {% extends 'parents.html' %}
      
      {# 根據block可以修改原有的block內容 #}
      {% block title %}子模板標題{% endblock %}
      
      {% block body %}
          {# 保留基礎模板中的內容 #}
          {{ super() }}
          <div>新加的內容</div>
      {% endblock %}
      
    • 提醒:若在子模板重寫了一個block,原來的顯示效果全丟了,八成的原因是忘記書寫{{ super() }}