【问题标题】:Flask User Session烧瓶用户会话
【发布时间】:2018-06-05 17:31:17
【问题描述】:

验证用户身份后,我无法在用户浏览我建立的网站时保持登录状态。我曾尝试使用 cookie 和会话,但我似乎无法让它工作。

我正在共享我的登录代码,我在其中获取数据以从注册时填充的 Excel 表中验证用户

我找到每个团队成员的名字,让他们出现在团队页面上,这是用户在登录后被重定向到的地方

@app.route('/login',methods=['POST','GET'])
def login():
# get data from form
try:
    username = str(request.form['username2'])
    password2 = str(request.form['password2'])
    teamname = str(request.form['teamname'])
    print(username)
    print(password2)

    # read excel sheet
    data = pd.read_excel("C:\\Users\\290002925\\Documents\\registration.xlsx")

    for name in data['Team']:
        if name == teamname:
            team_info = data.loc[data['Team'] == teamname]
            print(team_info)
            team_info['FullName'] = team_info['FirstName'] + [' '] + team_info['LastName']
            teamroster = team_info[['FullName']].copy()
            finalteamroster = pd.DataFrame(teamroster, index=range(5))
            print(finalteamroster)
            print(len(finalteamroster))
            finalteamroster.fillna(value='', inplace=True)
            print(finalteamroster)

            amember1 = finalteamroster.at[0,'FullName']
            print(amember1)
            amember2 = finalteamroster.at[1,'FullName']
            print(amember2)
            amember3 = finalteamroster.at[2,'FullName']
            print(amember3)
            amember4 = finalteamroster.at[3,'FullName']
            print(amember4)
            amember5 = finalteamroster.at[4,'FullName']
            print(amember5)

这就是用户身份验证的用武之地

    for user in data['Email']:
        #check username
        if user == username:
            passw = data.loc[data['Email'] == username]
                # check password
            print(passw)
            test2 = passw.iat[0,3]

这就是我写出 cookies 的方式,但我认为 Session 可能更有用

            if test2 == password2:
                    # authenticated
                print("User is authenticated")
                response = render_template('teampage.html', teamname=teamname, member1=amember1, member2=amember2, member3=amember3, member4=amember4, member5=amember5)
                response.set_cookie('userID', username)
                return response

            else:
                print("Password is incorrect")
                return render_template('login.html')
        else:
            print("Username is incorrect")
        return render_template('index.html')

except:
    print("fail")
return render_template('login.html')

团队页面代码

@app.route('/teampage')
def teampage():
    userid = request.cookies.get('userID')
    return render_template('teampage.html', userid=userid)

HTML 用户参考

{{userid}}

【问题讨论】:

    标签: python flask flask-login flask-session


    【解决方案1】:

    理解你的初始代码有点困难,但我理解的是你需要维护一个用户会话-

    @app.route('/login', methods=['GET', 'POST'])
    def login():
    if request.method == 'GET':
        return render_template('login.html', title=': Login')
    if request.method == 'POST':
       if YourMethodToCheckPassword==True:
                session['username'] = request.form['user']
                return redirect(url_for('home'))
    

    然后在任何地方都使用 Session 对象-

    @app.route('/home')
    def home():
        if 'username' in session:
            return render_template("index.html", name=session['username'])
    

    在你的 HTML 中使用

    {{ name }}
    

    【讨论】:

    • 这很有帮助!如果我尝试存储多个数据字段(团队成员姓名),我该怎么做?我试着做一些很长的事情 session['userID'] = username session['amember1'] = amember1 session['amember2'] = amember2 session['amember3'] = amember3 session['amember4'] = amember4 session ['amember5'] = amember5 if 'userID', 'amember1', 'amember2' in session:
    • 是的,有可能并且有更简单的方法。但是,让我们通过将其作为一个单独的问题提出来帮助社区,如果您发现它有帮助,请将我的答案标记为正确答案。谢谢
    • 仅供参考:您可以使用 jinja2 在 HTML 中使用 {{ session['usernam'] }} 全局访问 session,而不是每次都将其传递给路由。
    猜你喜欢
    • 2017-06-11
    • 2018-08-18
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多