【问题标题】:Passing a flask session variable to a different view returns type None将烧瓶会话变量传递给不同的视图返回类型无
【发布时间】:2016-06-14 22:33:45
【问题描述】:

我正在尝试将在登录视图上设置的会话变量传递给另一个视图。但是,如果提交表单,会话变量总是返回 None,我希望会话变量保留。

工具页面有一些表单字段和一个文本框,用于处理基于会话['foo'] 的自动完成搜索,该会话在良好登录时发送。

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # Get some form variables here
        if login is valid:
            login_user(user, remember=True)
            session['foo'] = utils.get_data()
            return redirect(url_for('tools'))
    return render_template('login.html')

@app.route("/tools", methods=['GET', 'POST'])
@login_required
def tools():
    if session['foo'] is None:
        print "Data is None type, getting data"
        session['foo'] = utils.get_data()

    if request.method == 'POST':
        # Handling some forms here
        # If one of these forms are submitted, session['foo'] is set to None :(

    return render_template('tools.html', foo_data=session['foo'])

Utils.py

def get_data():
    response = requests.post(url, data=data)  # FYI, server won't allow GET for this call.
    # Do json type stuff here to make response.content nice for javascript
   return response

基本上,这段代码发生的情况是,每次我提交表单时,我都必须检查它是否为 None 并调用 utils.get_data(),我希望此方法返回的数据保留整个长度会议。

编辑: 解决办法,会话变量对象太大。解决这个问题的一些方法可能包括:

  • 使用 AJAX 避免每次提交时刷新页面,从而不会刷新会话对象
  • 将对象分割成更小的块
  • 避免在 cookie 中存储大型对象 - 使用本地存储

【问题讨论】:

  • 您是否设置了密钥,正如here 所解释的那样?
  • 我当然会这样做 :) 我可以在 javascript/客户端上很好地使用该变量,我的问题是每次表单刷新页面时它都会变为 None。编辑:实际上我的设置为 app.config['SECRET_KEY'] = 'super secret key'
  • 是 "session['search_data'] = utils.get_data() 复制粘贴错误还是应该是 "session['foo'] = utils.get_data()"
  • 复制粘贴错误,将修复!

标签: javascript python json session flask


【解决方案1】:

如果数据大小有问题,您也可以创建服务器端会话。 可以将 Flask 会话存储在数据库中,并将会话 ID 存储在 cookie 中。

例如,snippet 展示了如何在 MongoDB 中存储会话数据。

【讨论】:

    【解决方案2】:

    检查被放入会话的数据的大小。如果它太大,请尝试使用较小的对象。

    来自documentation

    关于基于 cookie 的会话的注意事项:Flask 将获取您放入会话对象的值并将它们序列化为 cookie。如果您发现某些值不会在请求中持续存在,则确实启用了 cookie,并且您没有收到明确的错误消息,请检查页面响应中 cookie 的大小与 Web 浏览器支持的大小相比。

    原帖:

    从技术上讲,utils.get_data 方法是一个独立于网络调用的会话。 get data 方法试图达到什么目的?

    【讨论】:

    • get_data() 只是从带有 python 请求的端点请求一个 json 字典。我将 dict 操作到一个列表中,例如["foo", "bar", "stringz"] tools() 将数据发送到 html 页面,其中 javascript 使用列表作为数据处理自动完成。
    • 请求的数据大小是多少?来自 doco “关于基于 cookie 的会话的说明:Flask 将获取您放入会话对象的值并将它们序列化为 cookie。如果您发现某些值不会在请求中持续存在,则确实启用了 cookie,并且您正在没有收到明确的错误消息,请检查页面响应中 cookie 的大小与 Web 浏览器支持的大小相比。”
    • 另外端点是由这个烧瓶应用程序控制还是在外部托管?
    • Jase,好像是尺码。谢谢你,我什至没有考虑这个。端点由外部控制,它是一个非常大的对象,如果我返回较小的对象,它就可以正常工作。将此作为答案:)!
    • 我已经更新了我的问题以包含您的解决方案以及其他可能的解决方法。谢谢,杰斯。
    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 2017-11-19
    • 2019-05-15
    • 2020-12-21
    • 1970-01-01
    • 2021-08-31
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多