簡體   English   中英

Flask 登錄 @login_required 不起作用

[英]Flask login @login_required not working

我正在使用flask-login 來確保用戶在訪問某些頁面之前已登錄。 我在要保護的視圖上使用@login_required ,但即使我在要設置login_user(user)位置設置login_user(user) ,它也不允許我進入受保護的路由(索引)。 我正在打印我的user_login(user)的值,它返回True 我做錯了什么?

@app.route('/')
@app.route('/index')
@login_required
def index():
    print("was in here", file=sys.stderr)
    return render_template('index.html')

這是我設置user_login(user)的路線

@app.route('/authenticate')
def authenticate():
    code = request.args.get('code')
    state = request.args.get('state')
    quiz_auth_response = quizlet_auth(code, state)

    g.token = quiz_auth_response['token']

    response = json.loads(make_request(quiz_auth_response['user_name']))

    try:
        user = models.User.get(models.User.username == response['username'])
        login_user(user)
    except models.DoesNotExist:
        print("does not exist", file=sys.stderr)
        user = models.User.create_user(response['username'], response['id'])
        return redirect('/index')
    else:
        login_user(user)
        print("log in user " + str(login_user(user)), file=sys.stderr)
        login_user(user)
        return redirect('/index')

這是我的 user_loader

@login_manager.user_loader
def load_user(userid):
    try:
        return models.User.get(models.User.id == userid)
    except models.DoesNotExist:
        return None

這是我的用戶模型

sqlite_db = SqliteDatabase('sqlite.db')

class BaseModel(Model):
    class Meta:
        database = sqlite_db

class User(UserMixin, BaseModel):
    username = CharField(unique=True)
    quizlet_id = CharField(unique=True)
    joined_at = DateTimeField(default=datetime.datetime.now)

    @classmethod
    def create_user(cls, username, quiz_id, **kwards):

        try:
            cls.select().where(
                (cls.username == username) | (cls.quizlet_id == quiz_id)
            ).get()
        except cls.DoesNotExist:
                print("putting user in thing", file=sys.stderr)
                user = cls(username = username, quizlet_id = quiz_id)

                print(user.username)
                user.save()
                return user
        else:
            raise Exception("User with that email exists already")

    @staticmethod
    def set_password(password):

        return generate_password_hash(password.encode('utf-8'))

我的問題是@flask_login.login_required裝飾器在@app.route('<path>')裝飾器之上,所以我只是替換了它們並且它起作用了

由此:

@flask_login.login_required
@app.route('/')
def index():
    return render_template("index.html")

對此:

@app.route('/')
@flask_login.login_required
def index():
    return render_template("index.html")

剛剛花了最后 2 個小時試圖解決這個問題,並意識到這是因為 login_required 無法正常工作的配置

在我的本地開發環境中,我設置了

app.config['TESTING'] = True

來自燒瓶登錄文檔

如果應用程序配置變量LOGIN_DISABLEDTESTING設置為 True,則login_required裝飾器將被忽略

將它設置回這個並讓它工作

app.config['TESTING'] = False

用戶名字段是主鍵嗎? 假設您使用的是 sql alchemy,get() 方法會尋找主鍵並且不接受表達式,請參閱http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm。查詢.Query.get

再試一次user = models.User.filter_by(username=response['username']) ...

只需檢查用戶是否已登錄。可能存在用戶登錄的 cookie。我通過將用戶設置為已登錄並添加了 cookie 來測試是否一切正常。
我剛剛添加了這個並讓它工作

@app.before_first_request
def init_app():
    logout_user()

它工作得很好

如果您使用flask-login,您需要確保您有一個函數可以被庫使用以根據ID 加載用戶。 這種類型的東西:

@login_manager.user_loader
def load_user(user_id):
    return models.User.get(models.User.id == user_id)

請閱讀文檔的這一部分以了解如何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM