【发布时间】:2020-05-07 20:21:29
【问题描述】:
我正在使用Flask-Session 实现服务器端会话cookie。
该实现在很大程度上运行良好,但在使用 Chrome 访问我的 API 时遇到以下错误:
sqlalchemy.exc.DataError: (pymysql.err.DataError) (1406, "Data too long for column 'session_id' at row 1")
这是我的会话表 (flask_sessions_table) 的架构(由烧瓶扩展生成):
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| session_id | varchar(255) | YES | UNI | NULL | |
| data | blob | YES | | NULL | |
| expiry | datetime | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
我在任何其他主流浏览器(Firefox、Chromium、Safari、Postman 等)上都没有遇到此错误。看来从 Chrome 发送到我的基于 Flask 的应用程序的会话 cookie 太长(约 300 个字符,有时甚至约 1200 个字符),而从其他浏览器来看,它们最多约 50 个字符。请参阅此附加图片:
这个错误导致我的应用程序(API 服务器)崩溃,因为flask-session 无法在每个传入的请求上保存会话 cookie。我想到了以下解决方法,但它们不起作用:
- 将 flask_sessions_table.session_id 从 varchar(255) 转换为 LONGTEXT。 SQLAlchemy (ORM) 似乎不支持文本类型?
- 截断并保存 chrome cookie 中的前 255 个字符。在保存会话 cookie 之前似乎没有办法“拦截”请求:扩展程序会在我的请求路由上的语句执行之前立即保存 cookie
关于如何为 Chrome 解决此问题的任何其他想法?
更新: 我观察到,当域为“localhost”时,cookie 的长度超过 255 个字符,而从ngrok 访问相同的实例时,它们是正常的(~43 个字符)。 localhost 上的 Chrome 可能导致长会话 cookie 的原因是什么?
【问题讨论】:
-
您可以更改服务器以发送以“begin”开头并以“end”结尾的特殊cookie吗?
-
嗨@curiousguy,我什么时候/在哪里可以在Flask服务器上,在每个请求上做到这一点?此外,这种变化会引入/实现什么?
-
我会直接更改生成 cookie 的代码。至少 cookie 不会再看起来随意了。
-
我希望我可以控制 cookie 的生成方式,但实际上不能,因此我描述了这个问题。我只是从客户端接收 cookie 并将它们存储在服务器端。我只能控制来自前端应用的 cookie,但不能控制来自浏览器的 cookie
-
浏览器不会发明 cookie。它们要么由服务器发送,要么由 JS 代码设置。
标签: google-chrome flask cookies flask-session