1. 程式人生 > >Flask藍圖,Session,閃現,中介軟體等

Flask藍圖,Session,閃現,中介軟體等

Session

除請求物件之外,還有一個 session 物件。它允許你在不同請求間儲存特定使用者的資訊。它是在 Cookies 的基礎上實現的,並且對 Cookies 進行金鑰簽名要使用會話,你需要設定一個金鑰。

設定:session['username'] = 'xxx'

刪除:session.pop('username', None)

from flask import Flask,url_for,session

app = Flask(__name__)
app.secret_key = "sdsfdgdgdgd"
app.config['SESSION_COOKIE_NAME'] = 'session_lvning'  #設定session的名字

@app.route('/index/')
def index(nid):
    #session本質上操作的是字典, 所有對session操作的方法與字典方法相同
    #session的原理:如果下一次訪問的時候帶著隨機字串,會把session裡面對應的
    # 值拿到記憶體,假設session儲存在資料庫,每執行一次連結一次資料庫,每次都要時時更新的話,會非常損耗資料庫的效率
    session["xxx"] = 123
    session["xxx2"] = 123
    session["xxx3"] = 123
    session["xxx4"] = 123
    del session["xxx2"]  #在這刪除了,真正儲存的時候是沒有xxx2的
    return "ddsf"

if __name__ == '__main__':
    app.run()

關於session的配置

app.config['SESSION_COOKIE_NAME'] = 'session_lvning'

- session超時時間如何設定?      'PERMANENT_SESSION_LIFETIME':           timedelta(days=31)
 以下是跟session相關的配置檔案
"""
            'SESSION_COOKIE_NAME':                  'session',
            'SESSION_COOKIE_DOMAIN':                None,
            'SESSION_COOKIE_PATH':                  None,
            'SESSION_COOKIE_HTTPONLY':              True,
            'SESSION_COOKIE_SECURE':                False,
            'SESSION_REFRESH_EACH_REQUEST':         True,  #是否每次都跟新
            'PERMANENT_SESSION_LIFETIME':           timedelta(days=31)

基本使用

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

@app.route('/')
def index():
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])
    return 'You are not logged in'

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''
        <form action="" method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''

@app.route('/logout')
def logout():
    # remove the username from the session if it's there
    session.pop('username', None)
    return redirect(url_for('index'))

# set the secret key.  keep this really secret:
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

自定義Session

pip3 install Flask-Session

        run.py
            from flask import Flask
            from flask import session
            from pro_flask.utils.session import MySessionInterface
            app = Flask(__name__)

            app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
            app.session_interface = MySessionInterface()

            @app.route('/login.html', methods=['GET', "POST"])
            def login():
                print(session)
                session['user1'] = 'alex'
                session['user2'] = 'alex'
                del session['user2']

                return "內容"

            if __name__ == '__main__':
                app.run()

        session.py
            #!/usr/bin/env python
            # -*- coding:utf-8 -*-
            import uuid
            import json
            from flask.sessions import SessionInterface
            from flask.sessions import SessionMixin
            from itsdangerous import Signer, BadSignature, want_bytes


            class MySession(dict, SessionMixin):
                def __init__(self, initial=None, sid=None):
                    self.sid = sid
                    self.initial = initial
                    super(MySession, self).__init__(initial or ())


                def __setitem__(self, key, value):
                    super(MySession, self).__setitem__(key, value)

                def __getitem__(self, item):
                    return super(MySession, self).__getitem__(item)

                def __delitem__(self, key):
                    super(MySession, self).__delitem__(key)



            class MySessionInterface(SessionInterface):
                session_class = MySession
                container = {}

                def __init__(self):
                    import redis
                    self.redis = redis.Redis()

                def _generate_sid(self):
                    return str(uuid.uuid4())

                def _get_signer(self, app):
                    if not app.secret_key:
                        return None
                    return Signer(app.secret_key, salt='flask-session',
                                  key_derivation='hmac')

                def open_session(self, app, request):
                    """
                    程式剛啟動時執行,需要返回一個session物件
                    """
                    sid = request.cookies.get(app.session_cookie_name)
                    if not sid:
                        sid = self._generate_sid()
                        return self.session_class(sid=sid)

                    signer = self._get_signer(app)
                    try:
                        sid_as_bytes = signer.unsign(sid)
                        sid = sid_as_bytes.decode()
                    except BadSignature:
                        sid = self._generate_sid()
                        return self.session_class(sid=sid)

                    # session儲存在redis中
                    # val = self.redis.get(sid)
                    # session儲存在記憶體中
                    val = self.container.get(sid)

                    if val is not None:
                        try:
                            data = json.loads(val)
                            return self.session_class(data, sid=sid)
                        except:
                            return self.session_class(sid=sid)
                    return self.session_class(sid=sid)

                def save_session(self, app, session, response):
                    """
                    程式結束前執行,可以儲存session中所有的值
                    如:
                        儲存到resit
                        寫入到使用者cookie
                    """
                    domain = self.get_cookie_domain(app)
                    path = self.get_cookie_path(app)
                    httponly = self.get_cookie_httponly(app)
                    secure = self.get_cookie_secure(app)
                    expires = self.get_expiration_time(app, session)

                    val = json.dumps(dict(session))

                    # session儲存在redis中
                    # self.redis.setex(name=session.sid, value=val, time=app.permanent_session_lifetime)
                    # session儲存在記憶體中
                    self.container.setdefault(session.sid, val)

                    session_id = self._get_signer(app).sign(want_bytes(session.sid))

                    response.set_cookie(app.session_cookie_name, session_id,
                                        expires=expires, httponly=httponly,
                                        domain=domain, path=path, secure=secure)

第三方session

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
pip3 install redis
pip3 install flask-session

"""


from flask import Flask, session, redirect
from flask.ext.session import Session


app = Flask(__name__)
app.debug = True
app.secret_key = 'asdfasdfasd'


app.config['SESSION_TYPE'] = 'redis'
from redis import Redis
app.config['SESSION_REDIS'] = Redis(host='192.168.0.94',port='6379')
Session(app)


@app.route('/login')
def login():
    session['username'] = 'alex'
    return redirect('/index')


@app.route('/index')
def index():
    name = session['username']
    return name


if __name__ == '__main__':
    app.run()

Django和Flask中session的區別

Django中,session儲存在服務端的資料庫中,資料庫中儲存請求使用者的所有資料,服務端資料中{'隨機字串':加密後的客戶相關資訊}
請求完成後,把隨機字串作為值,返回給客戶端,儲存在客戶端的cookie中,鍵為:sessionid,值為:服務端返回的隨機字串;即{'sessionid':'隨機字串'}

Flask中,服務端什麼都不存,使用者第一次請求時,在記憶體中生成一個空字典,將這個空字典加密後,返回給客戶端,儲存在客戶端的cookie中,鍵為’session',值為:加密後的字典
下次訪問時,讀取客戶端cookie中key為session對應的值
然後進行解密(如果不能按之前的的加密方式對應個解密方式解密,即認為第一次請求,重新生成空字典),解密成功後,可以對字典進行操作,儲存新資料在字典中,請求完成後,會重新加密這個字典,返回個客戶端儲存

藍圖(flask中多py檔案拆分都要用到藍圖)

如果程式碼非常多,要進行歸類。不同的功能放在不同的檔案,吧相關的檢視函式也放進去。藍圖也就是對flask的目錄結構進行分配(應用於小,中型的程式)

藍圖用於為應用提供目錄劃分:

小中型:

Flask藍圖,Session,閃現,中介軟體等

manage.py

import fcrm
if __name__ == '__main__':
    fcrm.app.run()

__init__.py(只要一匯入fcrm就會執行init.py檔案)

from flask import Flask
#匯入accout 和order
from fcrm.views import accout
from fcrm.views import order
app = Flask(__name__)
print(app.root_path)  #根目錄

app.register_blueprint(accout.accout)  #把藍圖註冊到app裡面,accout.accout是建立的藍圖物件
app.register_blueprint(order.order)

accout.py

from flask import  Blueprint,render_template
accout = Blueprint("accout",__name__)

@accout.route('/accout')
def xx():
    return "accout"

@accout.route("/login")
def login():
    return render_template("login.html")

order.py

from flask import Blueprint
order = Blueprint("order",__name__)

@order.route('/order')
def register():   
    return "order

大型:

Flask藍圖,Session,閃現,中介軟體等

Flask藍圖,Session,閃現,中介軟體等

Flask藍圖,Session,閃現,中介軟體等

注意:
藍圖中的檢視函式的名字不能和藍圖物件的名字一樣!!!

其他:

藍圖URL字首:xxx = Blueprint('account', __name__,url_prefix='/xxx')
藍圖子域名:xxx = Blueprint('account', __name__,subdomain='admin')
# 前提需要給配置SERVER_NAME: app.config['SERVER_NAME'] = 'hc.com:5000'
# 訪問時:admin.hc.com:5000/login.html

閃現(flash)

session存在在服務端的一個字典裡面,session儲存起來,取一次裡面還是有的,直到你刪除之後才沒有了

1、本質

flash是基於session建立的,flash支援往裡邊放值,只要你取一下就沒有了,相當於pop了一下。不僅可以拿到值,而且可以把其從session裡的去掉,
基於Session實現的用於儲存資料的集合,其特點是:使用一次就刪除。

2、閃現的用途
某個資料僅需用一次時,可以使用閃現

from flask import Flask,session,Session,flash,get_flashed_messages,redirect,render_template,request
app = Flask(__name__)
app.secret_key ='sdfsdfsdf'

@app.route('/users')
def users():
    # 方式一
    # msg = request.args.get('msg','')
    # 方式二
    # msg = session.get('msg')
    # if msg:
    #     del session['msg']
    # 方式三
    v = get_flashed_messages()  # 獲取flash中的值
    print(v)
    msg = ''
    return render_template('users.html',msg=msg)

@app.route('/useradd')
def user_add():
    # 在資料庫中新增一條資料
    # 假設新增成功,在跳轉到列表頁面時,顯示新增成功
    # 方式一
    # return redirect('/users?msg=新增成功')
    # 方式二
    # session['msg'] = '新增成功'
    # 方式三
    flash('新增成功')
    return redirect('/users')


if __name__ == '__main__':
    app.run(debug=True)

中介軟體

在函式執行之前或函式執行之後想做點事情,有2種方式

第一種:裝飾器

第二種:flask裡面的擴充套件,相當於django中的中介軟體

            
           

相關推薦

Flask藍圖Session閃現中介軟體

Session 除請求物件之外,還有一個 session 物件。它允許你在不同請求間儲存特定使用者的資訊。它是在 Cookies 的基礎上實現的,並且對 Cookies 進行金鑰簽名要使用會話,你需要設定一個金鑰。 設定:session['username'] = 'xxx' 刪除:session.po

第二篇 Flask基礎篇之(閃現藍圖請求擴展中間件)

UNC sage 詳情 mes 做的 spa 方法 裝飾器。 edi 本篇主要內容:   閃現   請求擴展     中間件     藍圖 寫裝飾器,常用 functools模塊,幫助設置函數的元信息 import functools def wrapper(func

flask中cookie,session的儲存呼叫刪除 方法(程式碼demo)

# -*- encoding: utf-8 -*- # cookie,session的儲存,呼叫,刪除 from flask import Flask,make_response,request,session ret = Flask(__name__)

cookiesession和localstoragesessionStorage的區別

cookie ​ cookie 是儲存於訪問者的計算機中的變數。每當同一臺計算機通過瀏覽器請求某個頁面時,就會發送這個 cookie。你可以使用 JavaScript 來建立和取回 cookie 的值。 ​ 當訪問者首次訪問頁面時,他或她也許會填寫他/她們的名字。名字會儲存於 cookie

4.body-parser中介軟體的使用專門處理前端的post請求同理get請求在本例不適用內含如何自定義中介軟體middleware

使用express框架可以結合中介軟體body-parser方便處理前端傳送過來的資料。(class10) 第一部分: 1.新建目錄後,開啟cmd---進入當前目錄---cnpm install express express-static body-parser   

Porter 3.0 釋出隨行付資料同步中介軟體

   資料同步中介軟體 Porter 3.0釋出。 Porter是一個外掛友好型的資料聚合、分發中介軟體,提供源端、目標端、資料過濾等外掛自定義開發的能力,能夠根據場景需要輕鬆定製同步任務。 目前Porter 3.0版本已釋出,這是一個里程碑式的更新版本,新增單機模式,同時對管

laravel框架學習(四)執行建立中介軟體提示無法找到該中介軟體的解決方法

按照官方提供的文件:http://laravelacademy.org/post/7812.html 1.建立中介軟體:先宣告中介軟體, php artisan make:middleware AdminMiddleware 會自動在app/Http/Middlewar

淺談cookiesession和localStoragesessionStorage的區別

寫在前面 既然是淺談,就不會詳細從底層原理解釋這幾個的區別,就簡單地聊一下,這幾個的區別,優缺點,應用場景 cookie和session 瀏覽器的快取機制提供了可以將使用者資料儲存在客戶端上的方式,可以利用cookie和session跟服務端進行資料互動。cooki

【架構設計之道】這一波優雅的操作會把你的中介軟體系統架構帶到另一個Level

今年企業對Java開發的市場需求,你看懂了嗎? >>>   

SpringBoot2基礎進階資料庫中介軟體系列文章目錄分類

一、文章分類 1、入門基礎 SpringBoot2:環境搭建和RestFul風格介面 2、日誌管理 SpringBoot2:配置L

Django(六)Session、CSRF、中介軟體

大綱 二、session 1、session與cookie對比 2、session基本原理及流程 3、session伺服器操作(獲取值、設定值、清空值) 4、session通用配置(在配置檔案中) 5、session引擎配置(db、cache、fil

flask=======session獲取設定刪除

from flask import Flask,session app =Flask(__name__) app.config['SECRET_KEY']='78325EFWEGWEGWECAQ' #設定session @app.route('/set_sess

Python Flask請求鉤子(hook)(類似Django中介軟體)

  請求鉤子是通過裝飾器的形式實現,Flask支援如下四種請求鉤子: before_first_request:在處理第一個請求前執行。 before_request:在每次請求前執行(檢視函式執行前)。 after_request:如果沒有未處理的異常丟擲,在每次請求後執

Python Flasksession

  demo.py(session): # coding:utf-8 from flask import Flask, session # 匯入session app = Flask(__name__) # flask的session需要用到的祕鑰字串 (如果用到sess

Python Flask藍圖功能模組化藍圖的基本定義與使用Blueprint

藍圖就是一個功能模組。 藍圖就是為了專案的模組化。 goods.py(商品模組,建立藍圖,註冊藍圖路由): # coding:utf-8 from flask import Blueprint # 匯入藍圖 # 1. 建立藍圖物件 (藍圖就是抽象的功能模組,模組化) app_good

個人flask筆記(請求響應session

一、請求(Request) def requesttese():      1.請求方式     print(request.method)       2.請求路徑     print(request.path)     3.請求引數(get) 類似於字典     pri

服務器sessionTomcat有自己的session維護機制apache有自己的session維護機制

關閉 應用程序 tcp href http tex lan 利用 服務 1.SESSION一般不是你說的這種工作方式,你打開一個瀏覽器,再打開一個,請求同一個網址,然後其中一個登陸,另外一個絕對不會也登陸。SESSION和瀏覽器本身這個程序就是掛鉤的,一般不通過IP和端口去

tp5.31session和cookie

作用 分享 logs con 技術分享 coo cnblogs src log 一、session: 1.先再config中打開 前綴即為默認作用域。 tp5.31,session和cookie

中介模型cbv視圖和查詢優化

可用 是否 foreign bool 完全 -s 情況 com ear 中介模型: 處理類似搭配 pizza 和 topping 這樣簡單的多對多關系時,使用標準的ManyToManyField 就可以了。但是,有時你可能需要關聯數據到兩個模型之間的關系上。 例如,有這樣

單點登錄sessionjsonp(待更新)

es2017 技術 單點 跨域 ima com bsp post class 單點登錄理解: 單點登錄系統設計: ajax跨域: 單點登錄,session,jsonp(待更新)