[flask]flask_login模塊,session及其他
讀flask源碼的時候,有一點一直到現在都沒有一個清晰的概念,比如四個全局變量g,current_app,session,request是怎麽做到的
按照查到的資料裏面的說法,為了不至於每次都主動調用函數去獲取請求值,所以在flask裏面用了設計模式中的Proxy,在flask中用到了LocalProxy對四個全局變量進行代理,同時為了讓其在多線程中可以訪問,使用了類LocalStack,然後這四個變量都綁定到這個LocalStack的一個實例上面,就比如_request_ctx_stack,而這個類實現了把不同的請求綁定到不同的線程上面或者協程上面。然後就實現了不同請求的全局可用變量。
但是看源碼,這四個變量的生成方式是一樣的,又怎麽實現flask文檔裏面說的這些呢?
比如:
session: A session basically makes it possible to remember information from one request to another.
g:....
還有flask_login 源碼中的login_user和logout_user,除了用到了session,還把當前用戶綁定到了_request_ctx_stack,為什麽,不綁定不行嗎?
1 from flask import Flask, session, request 2 app = Flask(__name__) 3 app.secret_key = ‘~\xc8\xc6\xe0\xf3,\x98O\xa8z4\xfb=\rNd‘ 4 5 @app.route(‘/login‘) 6 def login(): 7 uid = request.args.get(‘uid‘) 8 psw = request.args.get(‘psw‘) 9 if uid and psw: 10 session[‘uid‘] = uid 11 session[‘_login‘] = True 12 return ‘<h1>login succeed!</h1>‘ 13 return ‘<h1>login failed</h1>‘ 14 15 @app.route(‘/logout‘) 16 def logout(): 17 if ‘uid‘ in session: 18 session.pop(‘uid‘) 19 if ‘_login‘ in session: 20 session.pop(‘_login‘) 21 return ‘<h1>logout succeed</h1>‘ 22 return ‘<h1>logout failed<h1>‘ 23 24 25 @app.route(‘/test_login‘) 26 def tst(): 27 if ‘uid‘ in session: 28 return ‘<h1>you are still in</h1>‘ 29 else: 30 return ‘<h1>you have logouted</h1>‘ 31 if __name__ == ‘__main__‘: 32 app.run(debug=True)
同時分別用chrome和firefox去登錄退出,證明是可以的,互不幹擾,但是flask_login源碼離那樣寫是基於什麽考慮呢??
寫的很亂,先留下個問題吧
參考資料:
http://flask.pocoo.org/docs/0.10/api/#flask.request
https://flask-login.readthedocs.io/en/latest/
https://zhuanlan.zhihu.com/p/24629677
http://www.zlovezl.cn/articles/charming-python-start-from-flask-request/
[flask]flask_login模塊,session及其他