Flask的SessionInterface中的get_cookie_name之类的东西?

时间:2019-03-21 13:51:38

标签: flask flask-login

我需要根据用户在我的Flask应用程序中访问的URL的子路径使用不同的会话

例如,我希望访问www.example.com的用户具有基于名为“ root_cookie”的cookie的会话,但是访问www.example.com/subpath的用户应具有基于名为“ subpath_cookie”的cookie的会话< / p>

对我来说,这主要与Flask-Login有关,以及我希望如何根据用户登录的子路径设置不同的独立登录会话。

现在,Flask的session_interface属性允许您设置自定义类,您可以从SessionInterface中继承该类。 可以覆盖SessionInterface中的几乎所有内容,包括cookie的域(get_cookie_domain())和cookie的路径(get_cookie_path()),真是太好了。

我缺少的一件事是可以命名为get_cookie_name()的函数,由于上述原因,该函数将有助于重写。

我意识到也许我可以重写get_cookie_path()来为每个子路径设置一个不同的cookie。问题出现在根URL中。如果我将cookie的路径设置为“ /”,它也会在子路径中生效,包括那些我要使用其他会话的路径。因此,如果将其作为根URL,则设置不同的Cookie名称即可解决问题。

Flask中是否缺少任何机制可以帮助解决此问题?

2 个答案:

答案 0 :(得分:0)

您可以签出Response.set_cookie()方法,以在其中传递Cookie名称。可以在Flask的 SecureCookieSessionInterface 中找到示例:

response.set_cookie(
    app.session_cookie_name, # Substitute this with desired name.
    val,
    expires=expires,
    httponly=httponly,
    domain=domain,
    path=path,
    secure=secure,
    samesite=samesite
)

由于要基于端点设置名称,因此可能需要根据文档提供的请求对象:

  

对于在请求结束时由open_session()返回的实际会话调用此方法。在请求上下文中仍会调用此方法,因此,如果您绝对需要访问请求,则可以执行此操作。

来自SessionInterface.save_session()

答案 1 :(得分:0)

对必须重写save_session()来解决问题感到不满意之后,我提交了一个pull request以在Flask项目中创建一个get_cookie_name()方法,该方法已合并到master分支中。从Flask的2.0.0版本开始,您将能够按照以下文档使用此新功能:https://flask.palletsprojects.com/en/master/api/#flask.sessions.SessionInterface.get_cookie_name