Flask - 用户在重定向到新页面后停止登录

问题描述 投票:0回答:0

我正在用 python 中的 flask 创建我的第一个网络应用程序,但我正在努力解决用户登录问题。

  • 我有一个成功登录用户的登录路由。但是,一旦我重定向到新路线,当前用户就不再登录。
  • 我在 login() 和 upload() 中添加了一个 print() 语句来检查
    if current_user.is_authenticated
  • 我显然无权访问@login_required 路由。
  • 登录后我仍然可以在 /upload 中看到会话 cookie。

app.py

from flask import Flask, render_template, url_for, request, redirect, flash
from flask_login import LoginManager, login_user, logout_user, login_required, current_user
from config import config
from models.ModelUser import ModelUser
from models.entities.User import User

app = Flask(__name__)

import pandas as pd
db = pd.read_csv(r"C:\Users\clcastillof\Github\notas_oms\app\test_credentials\credentials.csv")

login_manager_app = LoginManager(app)
@login_manager_app.user_loader
def load_user(id):
    return ModelUser.get_by_id(db, id)


@app.route('/')
def index():
        return redirect(url_for('login'))


@app.route("/login", methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user = User(0, request.form['username'], request.form['password'])
        
        logged_user = ModelUser.login(db, user)

        if logged_user != None:
            if logged_user.password:
                login_user(logged_user)
                print('user logged: ' + current_user.username) if current_user.is_authenticated else print('user not logged in')
                return redirect(url_for('upload'))
            else:
                flash("Credenciales incorrectas.")
                return render_template('login.html')
        else:
            flash("Credenciales incorrectas.")
            return render_template('login.html')
    else:
        return render_template('login.html')


@app.route("/logout")
def logout():
    logout_user()
    return redirect(url_for('login'))


@app.route("/upload")
# @login_required
def upload():
    print('user logged: ' + current_user.username) if current_user.is_authenticated else print('user not logged in')
    return render_template('upload.html')


@app.route("/sent")
# @login_required
def sent():
    return render_template('sent.html')


if __name__ == '__main__':
    app.config.from_object(config['development'])
    app.run()

配置.py

class Config:
    SECRET_KEY = 'my_secret_key'

class DevelopmentConfig(Config):
    DEBUG = True

config = {
    'development': DevelopmentConfig
}

模型用户.py

from .entities.User import User
import pandas as pd

class ModelUser():

    @classmethod
    def login(self, db, user):
        try:          
            db = db.set_index('username')

            if user.username in db.index:
                user = User(db.loc[user.username, 'id'], 
                            user.username,
                            User.check_password(db.loc[user.username, 'password'], user.password))
                
                return user
            else:   
                return None


        except Exception as e:
            raise Exception(e)
        

    @classmethod
    def get_by_id(self, db, id):

        try:
            db = db.set_index('id')

            if id in db.index:
                logged_user = User(id, 
                            db.loc[id, 'username'],
                            None)
                
                return logged_user
            else:   
                return None


        except Exception as e:
            raise Exception(e)
    

用户.py

from werkzeug.security import check_password_hash, generate_password_hash
from flask_login import UserMixin

class User(UserMixin):
    def __init__(self, id, username, password) -> None:
        self.id = id
        self.username = username
        self.password = password

    @classmethod
    def check_password(self, hashed_password, password):
        return check_password_hash(hashed_password, password)
        

我目前正在从 .csv 中检索凭证,只是为了学习目的,请忽略它。

python python-3.x flask flask-login
© www.soinside.com 2019 - 2024. All rights reserved.