鍍金池/ 問(wèn)答/Python/ 前后分離的Flask 項(xiàng)目,寫在瀏覽器的cookie在請(qǐng)求過(guò)程中,怎么樣在服務(wù)端

前后分離的Flask 項(xiàng)目,寫在瀏覽器的cookie在請(qǐng)求過(guò)程中,怎么樣在服務(wù)端找回對(duì)應(yīng)的session

項(xiàng)目結(jié)構(gòu):react前端 + flask后端
問(wèn)題描述:當(dāng)我登錄后,調(diào)用session['token'] = username ,在瀏覽器的cookie看到寫入的cookie(鍵值對(duì)為session:asasjndjan);再次點(diǎn)擊登出時(shí),request.cookies.get('session')獲取到對(duì)應(yīng)的cookies,我的問(wèn)題是,根據(jù)這個(gè)cookies怎么樣獲取到之前的session,這樣就可以重新獲取到session中的username;

登錄代碼:

def login():
        raw_data = request.get_data()
        req_objt = json.loads(raw_data)
        username = req_objt.get('username')
        password = req_objt.get('password')

        user = User.query.filter(User.username == username, User.password == password).first()
        if user:
                session['token'] = username
回答
編輯回答
北城荒

你上面的這些操作是不需要手動(dòng)完成的,flask會(huì)自動(dòng)幫你完成,完成的大致流程如下

# set session
# 這個(gè)時(shí)候,在返回response時(shí),會(huì)一同將服務(wù)器為該session生成cookie返回給瀏覽器供瀏覽器設(shè)置
# 瀏覽器一
flask.session['test'] = 'test1'
# 瀏覽器二
flask.session['test'] = 'test2'

# 下次瀏覽器攜帶該cookie訪問(wèn)后端時(shí),后端會(huì)根據(jù)這個(gè)cookie自動(dòng)初始化session
# 從session中取出來(lái)的值即為對(duì)應(yīng)cookie的值
# 瀏覽器一
assert 'test1' == flask.session.get('test')
# 瀏覽器二
assert 'test2' == flask.session.get('test')

上述流程的實(shí)現(xiàn),請(qǐng)參考from flask.sessions import SecureCookieSessionInterface
下面是我貼出來(lái)的部分源碼及個(gè)人理解的注釋

# 初始化session
def open_session(self, app, request):
  # session是存放于服務(wù)器的,這個(gè)操作等于從服務(wù)器中獲取該服務(wù)器上的全部session
  s = self.get_signing_serializer(app)
  if s is None:
    return None
  # 獲取當(dāng)前request的session cookie
  val = request.cookies.get(app.session_cookie_name)
  if not val:
    return self.session_class()
  # session 存活時(shí)間
  max_age = total_seconds(app.permanent_session_lifetime)
  try:
    # 本次request cookie相關(guān)session
    data = s.loads(val, max_age=max_age)
    return self.session_class(data)
  except BadSignature:
    return self.session_class()

當(dāng)然,先獲取cookie,在自己通過(guò)cookie獲取內(nèi)容的方式也是可行的,只不過(guò)對(duì)于session而言應(yīng)該是沒(méi)太大必要的。
實(shí)現(xiàn)方案建議:

# 在服務(wù)器上通過(guò)內(nèi)存、redis等,為自己想要存放的東西開(kāi)放一個(gè)存儲(chǔ)空間
# 瀏覽器請(qǐng)求進(jìn)入
# 判斷是否攜帶自定義cookie,存在取之,不存在創(chuàng)建
cookie = get_cookie() or init_cookie()
# 設(shè)置值,比如自定義的存儲(chǔ)名叫session_myself,使用dict或者redis之類的
if not session_myself:
  session_myself = dict()
# 設(shè)置值
session_current = session_myself.get(cookie, {})
session_current['test'] = 'test'
# 再把cookie返回給瀏覽器即可

# 取值的方式類似
2017年10月5日 00:32
編輯回答
尤禮

前后端分離的項(xiàng)目已放棄session.

2017年2月19日 04:56
編輯回答
互擼娃

在前后端分離的項(xiàng)目中,一般會(huì)以令牌的方式來(lái)鑒權(quán)
如果非得使用session的方式,需要在客戶端請(qǐng)求的時(shí)候帶上cookie

2018年8月28日 18:13