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的目錄結構進行分配(應用於小,中型的程式)
藍圖用於為應用提供目錄劃分:
小中型:
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
大型:
注意:
藍圖中的檢視函式的名字不能和藍圖物件的名字一樣!!!
其他:
藍圖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__)
cookie,session和localstorage,sessionStorage的區別
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
淺談cookie,session和localStorage,sessionStorage的區別
寫在前面 既然是淺談,就不會詳細從底層原理解釋這幾個的區別,就簡單地聊一下,這幾個的區別,優缺點,應用場景 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 Flask,session
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
服務器session,Tomcat有自己的session維護機制,apache有自己的session維護機制
關閉 應用程序 tcp href http tex lan 利用 服務 1.SESSION一般不是你說的這種工作方式,你打開一個瀏覽器,再打開一個,請求同一個網址,然後其中一個登陸,另外一個絕對不會也登陸。SESSION和瀏覽器本身這個程序就是掛鉤的,一般不通過IP和端口去
tp5.31,session和cookie
作用 分享 logs con 技術分享 coo cnblogs src log 一、session: 1.先再config中打開 前綴即為默認作用域。 tp5.31,session和cookie
中介模型,cbv視圖,和查詢優化
可用 是否 foreign bool 完全 -s 情況 com ear 中介模型: 處理類似搭配 pizza 和 topping 這樣簡單的多對多關系時,使用標準的ManyToManyField 就可以了。但是,有時你可能需要關聯數據到兩個模型之間的關系上。 例如,有這樣
單點登錄,session,jsonp(待更新)
es2017 技術 單點 跨域 ima com bsp post class 單點登錄理解: 單點登錄系統設計: ajax跨域: 單點登錄,session,jsonp(待更新)