@zlodiak

Почему после входа не меняется флаг авторизации?

Я реализовал регистрацию/авторизацию на простейшем сайте. Проблема в том, что после того как пользователь авторизовался у меня не получается в шаблоне заменить ссылку "войти" на ссылку "выйти".

Для этого я использую атрибут модели, который подмешан в неё при помощи UserMixin. Сам атрибут назвается is_anonymous и используется в шаблоне так:

{% if current_user.is_anonymous %}
    <a href="{{ url_for('registration') }}">Регистрация</a>
    <a href="{{ url_for('login') }}">Вход</a>               
{% else %}
    <a href="{{ url_for('logout') }}">Выход</a>
{% endif %}


Однако вне зависимости от того аторизовался пользователь или нет этот атрибут всегда имеет значение True.

Вот моя модель:
from app import db, login

import datetime

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


class User(UserMixin, db.Model):
    __tablename__ = 'users'

    id =            db.Column(db.Integer, primary_key=True)
    username =      db.Column(db.String(40), unique=True, nullable=False)
    password_hash = db.Column(db.String(128), nullable=False)
    reg_date_utc =  db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow())
    upd_date_utc =  db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow())
    email =         db.Column(db.String(40))
    desc =          db.Column(db.Text)
    is_active =     db.Column(db.Boolean, default=False) 

@login.user_loader
def load_user(id):
    return User.query.get(int(id))


вот роут:
from flask import render_template, request, url_for, redirect, flash
from flask_login import current_user, login_user, logout_user, login_required

from app import app, db
from app.forms import RegistrationForm, LoginForm
from app.models import User

...
.....

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

    if request.method == 'POST' and login_form.validate_on_submit():
        user = User.query.filter_by(email=request.form['email']).first()
        if user is None or not user.check_password(request.form['password']):
            flash('Неверные авторизационные данные')
            return redirect(url_for('login'))
        else:
            login_user(user)
            flash('Вы вошли')
            return redirect(url_for('index'))

    return render_template('login.html', title='Вход', form=login_form)


вот инициализация пакета:
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager

app = Flask(__name__)
app.config.from_object(Config)

db = SQLAlchemy(app)
migrate = Migrate(app, db)

login = LoginManager(app)
login.login_view = 'login'

from app import routes, models


Сам flask-login установлен.

Подскажите пожалуйста что не так и где искать ошибку. Дело в том, что я делал всё это на основе популярного туториала и в прошлом подобном проекте система авторизации работала без проблем.

Вот ссылка на репозиторий, если нужно.
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы