【问题标题】:Flask session variables烧瓶会话变量
【发布时间】:2020-04-18 10:46:26
【问题描述】:

我正在用烧瓶编写一个小型网络应用程序。当两个用户(在同一网络下)尝试使用 app.js 时,我遇到了会话变量问题。

这是代码:

import os

from flask import Flask, request, render_template, g, session
from random import randint

def random():
     session['number'] = randint(0,4)
     return None

@app.route('/')
def home():
  if not session.get('logged_in'):
    return render_template('login.html')
  else: 
    return check()

@app.route('/login', methods = ['GET', 'POST'])
def login():
      global username
      username = request.form['username']
      session['logged_in'] = True
      session['username'] = username
      return check()

@app.route('/check', methods=['GET', 'POST'])
def check():
       random()
       return render_template('file.html', number = session['number'], user = session['username'])

if __name__ == "__main__":
    app.secret_key = ".."
    app.run(host = '0.0.0.0',port = 3134, debug=False)

在 file.html 中有一个按钮类型“提交”,它调用 '/check' 路由。 问题是当两个用户同时使用应用程序时,因为变量“数字”等于最后一个按下按钮的用户的变量“数字”......两个会话之间没有独立性。

我希望这两个用户有两个独立会话,就像他们在本地主机中使用我的应用程序一样。

【问题讨论】:

  • 你可以把你的变量放在一个字典中,以用户名作为键,然后保存在会话中
  • @MrLeeh 所以我可以写:random = randint(0,4) session = {"username": "username", "username": "random"} ??然后我怎样才能得到我想在 render_template 中传递的变量?
  • 创建一个包含您的号码 numbers = {'username1': 4, 'username2': 2} 的字典并将其传递给您的会话 session['numbers'] = numbers
  • 我不能写 numbers = {'username1': 4, 'username2':2} 因为我不知道有多少用户调用了这个函数......
  • 这只是一个例子。在您的代码中,您当然可以使用numbers['usernamex']=randint(0,4),甚至可以使用session['numbers']['usernamex'] = randint(0,4)

标签: python session variables flask login


【解决方案1】:

使用randint(0,4) 生成数字意味着它们有时对于不同的用户是相等的。每次使用 uuid 生成唯一编号:

from uuid import uuid4
def random():
    session['number'] = str(uuid4())
    return None

或生成器:

import itertools
consequent_integers = itertools.count()

def random():
    session['number'] = consequent_integers.next()
    return None

【讨论】:

  • 是的,我希望不同用户的数字可以相同。但我不希望当用户 2 请求新号码时用户 1 的号码发生变化......示例:用户 1 运行应用程序并且他的号码是 3,然后用户 2 运行应用程序并且他的号码是 6......当用户 1在应用程序的其他页面上冲浪我不希望他的号码像在我的应用程序中那样变成 6。你明白我的问题吗?
  • 从我的观点来看,您的问题可能是您的网络服务上的 任何 操作会导致生成新号码。如我所见,您应该将 random()check() 移动到 login()
【解决方案2】:

所以你做这样的事情。它未经测试,但应该可以工作。您从会话变量中检索当前用户名和数字字典。检查当前用户名是否存在现有值。如果没有创建一个随机数并将其保存在会话中。否则只需使用保存的值。

@app.route('/check', methods=['GET', 'POST'])
def check():

   # retrieve current username and numbers from your session
   username = session['username']
   numbers = session.get('numbers', {})

   # if no number is existing create a new one and save it to session
   if username not in numbers:
       number = randint(0,4)
       numbers['username'] = number
       session['numbers'] = numbers
   else:
       number = numbers['username']

   return render_template('file.html', number=number, user=username)

【讨论】:

  • 我也是第一次使用这个功能并了解它。为什么在这里 numbers = session.get('numbers', {}) 如果没有会话,分配一个空字典而不是 None 例如。如果有 is 一个会话,它会返回一个字符串,所以如果没有一个,则不确定它是否有任何逻辑返回一个空字典..
【解决方案3】:

两个用户的会话变量相同的原因可能是因为您使用的是相同的计算机/浏览帐户。这就像 Facebook 在您打开一个新的 Facebook 选项卡后如何记住您的登录状态一样。

我建议您购买另一台计算机或使用不同的 Chrome 帐户(Google Chrome 的右上角)来测试不同的用户。

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2015-12-30
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多