前后分离的Flask 项目,写在浏览器的cookie在请求过程中,怎么样在服务端找回对应的session

项目结构:react前端 + flask后端
问题描述:当我登录后,调用session['token'] = username ,在浏览器的cookie看到写入的cookie(键值对为session:asasjndjan);再次点击登出时,request.cookies.get('session')获取到对应的cookies,我的问题是,根据这个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
阅读 5.9k
3 个回答

你上面的这些操作是不需要手动完成的,flask会自动帮你完成,完成的大致流程如下

# set session
# 这个时候,在返回response时,会一同将服务器为该session生成cookie返回给浏览器供浏览器设置
# 浏览器一
flask.session['test'] = 'test1'
# 浏览器二
flask.session['test'] = 'test2'

# 下次浏览器携带该cookie访问后端时,后端会根据这个cookie自动初始化session
# 从session中取出来的值即为对应cookie的值
# 浏览器一
assert 'test1' == flask.session.get('test')
# 浏览器二
assert 'test2' == flask.session.get('test')

上述流程的实现,请参考from flask.sessions import SecureCookieSessionInterface
下面是我贴出来的部分源码及个人理解的注释

# 初始化session
def open_session(self, app, request):
  # session是存放于服务器的,这个操作等于从服务器中获取该服务器上的全部session
  s = self.get_signing_serializer(app)
  if s is None:
    return None
  # 获取当前request的session cookie
  val = request.cookies.get(app.session_cookie_name)
  if not val:
    return self.session_class()
  # session 存活时间
  max_age = total_seconds(app.permanent_session_lifetime)
  try:
    # 本次request cookie相关session
    data = s.loads(val, max_age=max_age)
    return self.session_class(data)
  except BadSignature:
    return self.session_class()

当然,先获取cookie,在自己通过cookie获取内容的方式也是可行的,只不过对于session而言应该是没太大必要的。
实现方案建议:

# 在服务器上通过内存、redis等,为自己想要存放的东西开放一个存储空间
# 浏览器请求进入
# 判断是否携带自定义cookie,存在取之,不存在创建
cookie = get_cookie() or init_cookie()
# 设置值,比如自定义的存储名叫session_myself,使用dict或者redis之类的
if not session_myself:
  session_myself = dict()
# 设置值
session_current = session_myself.get(cookie, {})
session_current['test'] = 'test'
# 再把cookie返回给浏览器即可

# 取值的方式类似

前后端分离的项目已放弃session.

在前后端分离的项目中,一般会以令牌的方式来鉴权
如果非得使用session的方式,需要在客户端请求的时候带上cookie

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题