0

我正在使用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 个字符。请参阅此附加图像:

chrome 上的会话 cookie - 太大了!

此错误导致我的应用程序(API 服务器)崩溃,因为flask-session 无法在每个请求进入时保存会话 cookie。我想到了以下解决方法,但它们无法工作:

  1. 将 flask_sessions_table.session_id 从 varchar(255) 转换为 LONGTEXT。SQLAlchemy (ORM) 似乎不支持文本类型?
  2. 截断并保存 chrome cookie 中的前 255 个字符。在保存会话 cookie 之前似乎没有办法“拦截”请求:扩展程序会在我的请求路由上的语句执行之前立即保存 cookie

关于如何为 Chrome 解决此问题的任何其他想法?

更新:我观察到当域是“localhost”时,cookie 的长度超过 255 个字符,而当从ngrok访问相同的确切实例时,它们是正常的(~43 个字符)。本地主机上的 Chrome 可能导致长会话 cookie 的原因是什么?

4

1 回答 1

0

除了 Firefox,我遇到了这个问题。我能够通过清除浏览器上的 cookie 并重新启动 Flask 来解决它。

于 2020-11-13T16:51:46.350 回答