У меня проблемы с входом в систему клиентов и проверкой подлинности, активности и анонимности клиентов ... с использованием 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')