Я реализовал регистрацию/авторизацию на простейшем сайте. Проблема в том, что после того как пользователь авторизовался у меня не получается в шаблоне заменить ссылку "войти" на ссылку "выйти".
Для этого я использую атрибут модели, который подмешан в неё при помощи 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 установлен.
Подскажите пожалуйста что не так и где искать ошибку. Дело в том, что я делал всё это на основе популярного туториала и в прошлом подобном проекте система авторизации работала без проблем.
Вот ссылка на
репозиторий, если нужно.