尽管有硬编码的密钥,但Flask会话对象在请求之间不会持久存在



我目前在亚马逊的EB2服务上部署Flask应用程序时遇到问题。Flask应用程序在本地运行。然而,当它被部署时,它只适用于第一个点击链接的人。之后,它抛出以下错误:

内部服务器错误服务器遇到内部错误无法完成您的请求。服务器过载或应用程序中存在错误。

它抛出的错误与Flask会话有关——从一个站点路由到另一个站点后,它变为空。我还注意到,下面详细介绍的before_first_request函数对于第一个用户只运行一次,再也不会运行了——这更令人困惑。

下面是一个最小的例子:

from flask import Flask, render_template, request, session, url_for
application = Flask(__name__)
application.secret_key = "mysecretkey"
@application.before_first_request
def before_first_request():
""" these commands are run before the first request"""
# setup logging
application.logger.setLevel(logging.INFO)
application.logger.info('starting up Flask')
# clear session
session.clear()
# load in PID
session['pid'] = 123
# add parameters to the session
params = dict()
params['parameter'] = 0
session['params'] = params
application.logger.info(session) # it is printing the session as expected
return 'OK'

@application.route('/')
def main():
""" landing page """
application.logger.info(session) # empty
application.logger.info(application.secret_key) # as expected
params, results = session.pop('params'), session.pop('results') # throws out the error
return render_template('empty_template.jinja', args = session)

我想知道是否有人知道如何解决这个问题?

我设法解决了它。

错误是@before_first_request包装器在向应用程序发出第一个请求之前实际上只运行过一次。因此,会话实际上只创建和填充了一次。

我通过在main函数的顶部添加对before_first_request函数的调用来修复这个错误。

最新更新