Невозможно увидеть, является ли клиент аутентифицированным, активным или анонимным Flask -Login - PullRequest
0 голосов
/ 18 апреля 2020

У меня проблемы с входом в систему клиентов и проверкой подлинности, активности и анонимности клиентов ... с использованием SQLAlchemy и FLask -Login с уже существующей базой данных sqlite. Поскольку база данных, которую я использую, уже существует, я использую automap_base расширение sqlalchemy для взаимодействия с базой данных в flask.

Мои маршруты регистрации и входа в систему работают. Маршрут регистрации обрабатывает их имя пользователя и пароль и записывает их в базу данных (хэшируется). И логин правильно логинится в клиентах. Проблема в том, что база данных не получает статус is_active, is_anonymous et c ... в sql.

Часть моих маршрутов входа и регистрации, которые не работают, является

if current_user.is_authenticated:
    print('yes')
    return redirect(url_for('home'))

. После того, как я вхожу, я проверяю свои данные sqlite в другом окне, и нет никаких значений для is_authenticaed, is_active Статус is_anonymous и, как я уже упоминал выше, код в начале маршрутов входа и регистрации не определяет, аутентифицированы ли они.

Кроме того, я включаю токен csrf в качестве скрытого ввода в формы регистрации и входа в систему.

<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>

Сначала я столкнулся с проблемами при входе в систему и регистрации. Но я вручную добавил столбцы is_authenticaed, is_active, is_anonymous status в свою базу данных SQLITE3, и это сработало. (Я продолжал получать сообщение о том, что пользователи (имя таблицы, которую я использую) не имеют атрибута is_authenticated). Предполагается, что это значения TRUE или FALSE, поэтому я добавил их как TEXT в базу данных sqlite ... Я не знаю, в этом ли проблема, я не думаю, что sqlite имеет булеву поддержку, которая будет работать с классом User_Mixin из flask_login.

Обновление :: если я изменяю класс User (Base, UserMixin) на User (db.Model, UserMixin), я получаю сообщение об ошибке

Mapper mapped class User->users could not assemble any primary key columns for mapped table 'users'

и если я изменяю его на класс User (Product, UserMixin) он также не работает

Таблица данных Sqlite (после добавления этих столбцов ошибка исчезла, и я смог войти в систему и перейти на домашнюю страницу)

users(id INTEGER PRIMARY KEY, email TEXT NOT NULL, password TEXT NOT NULL,is_authenticated TEXT,is_active TEXT,is_anonymous TEXT);

Я пытался использовать обе версии маршрута "login_manger", указанного ниже. Ниже этих маршрутов находится класс, который используется для получения идентификатора указанного клиента c. Я думаю, что это login_manager, где я сталкиваюсь с моей проблемой, но я не знаю, я новичок в создании такого рода процесса.

UserMixin включен в класс, поскольку он должен создавать методы, необходимые для отслеживания сеанса клиентов. Этот класс меня больше всего смущает, так как я уже использую автоматизированный класс существующей базы данных.

Код, приведенный ниже, соответствует тому же порядку, что и код, выполняемый в приложении.

Спасибо за любую помощь, я новичок в этом и потерян.

Зависимости:

from flask import Flask, render_template, redirect, url_for, request, jsonify, flash
from flask_wtf.csrf import CSRFProtect
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.automap import automap_base
from flask_login import LoginManager
from flask_login import UserMixin
from flask_login import login_user, current_user, logout_user

Инстанции, которые я инициализирую с помощью приложения: csrf = CSRFProtect (app)

db = SQLAlchemy(app) 
Base = automap_base()
Base.prepare(db.engine, reflect=True)
Product = Base.classes.users ##users is the name of the table
bcrypt = Bcrypt(app)
login_manager = LoginManager(app)

Маршрут регистрации:

@app.route("/sign_up", methods=['GET', 'POST'])
def sign_up():
    if current_user.is_authenticated:
        print('yes')
        return redirect(url_for('home'))
    if request.method == "POST":
        email = request.form['email']
        if email in [i.email for i in db.session.query(Product).all()]:
            flash("You already got an account vato", 'danger')
            return redirect(url_for("sign_up"))
        else:
            password = request.form['password']
            hashed_password = bcrypt.generate_password_hash(str(password)).decode("utf-8")
            user = Product(email=email, password=hashed_password)
            db.session.add(user)
            db.session.commit()
            flash("You're account is awaiting confirmation!", 'success')
            return redirect(url_for("sign_up"))
    else:
        return render_template("sign_up.html")

Login_Manager:

@login_manager.user_loader  # this returns a user with a specific id to manager their session.

def load_user(user_id):
    return db.session.query(Product).get(int(user_id))


class User(Base, UserMixin):
    __tablename__ = 'users'

Login_Manager версия 2:

@login_manager.user_loader 
def load_user(user_id):
    return User.query.get(int(user_id))


class User(Base, UserMixin):
    __tablename__ = 'users'

Логин:

@app.route("/log_in", methods=['GET', 'POST'])
def log_in():
    if current_user.is_authenticated:
        print('yes')
        return redirect(url_for('home'))
    if request.method == "POST":
        if current_user.is_authenticated:
            return redirect(url_for("home"))
        email = request.form['email']
        password = request.form['password']
        user = db.session.query(Product).filter_by(email=email).first()
        if user and bcrypt.check_password_hash(user.password, password):
            login_user(user, remember=False)
            return redirect(url_for('home'))
        else:
            flash("Check your email and password ayee", 'danger')
            return render_template('login.html')
    return render_template('login.html')
...