Flask_session忽略OPTIONS请求



我正在编写一个应用程序,其中我需要使用JavaScript的";获取";由于CORS,我所有的请求都有一个飞行前选项请求。这意味着,在我的会话数据库中,每次发出OPTIONS请求时,它都会创建一个新的会话。我确实会在会话过期后删除它们,但是,每次删除那些无用的会话都会很乏味,而且会让服务器很紧张。

我有没有办法指定flask_session可以忽略OPTIONS请求?我到处都找过了,但找不到一个好的选择,而且flask_session文档也没有什么可写的(一旦过期,您必须手动删除会话(。

在处理CORS和OPTIONS飞行前请求时,似乎遇到了一个常见问题。和您一样,我也很难在Flask_session文档或其他在线文档中找到直接的解决方案。然而,我确实设法想出了一个变通办法,可以满足您的需求。

从本质上讲,我创建了一个自定义会话接口,以不同的方式处理OPTIONS请求,特别是通过为这些请求创建非永久会话。尽管这不是一个理想的解决方案,但它确实阻止了为这些会话创建数据库记录,从而减轻了服务器的压力。以下是操作方法:

首先,您需要从flask_session重写SqlAlchemySessionInterface类中的open_session方法。这将允许您检查请求方法是否为"OPTIONS",如果是,则创建一个非永久会话:

from flask_session import SqlAlchemySessionInterface as FlaskSessionSqlAlchemySessionInterface
class SqlAlchemySessionInterface(FlaskSessionSqlAlchemySessionInterface):
def __init__(self, app, db, table, key_prefix):
super().__init__(app, db, table, key_prefix)
def open_session(self, app, request):
if request.method == 'OPTIONS':
sid = self._generate_sid()
return self.session_class(sid=sid, permanent=False)
return super().open_session(app, request)

然后,在应用程序工厂中,将此自定义接口分配给应用程序的会话接口:

app.session_interface = SqlAlchemySessionInterface(app, db, 'sessions', 'session:')

如果您没有使用SqlAlchemy,那么您需要扩展适当的类。您可以在flask_session存储库中看到所有实现。

最新更新