[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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM