我正在使用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 个字符)。本地主机上的 Chrome 可能导致长会话 cookie 的原因是什么?