flask-login не уверен, как заставить его работать с помощью sqlite3
До сих пор я делал свой объект пользователя и свою функцию входа в систему, но я вообще не понимаю часть user_loader. Я очень запутался, но вот мой код, пожалуйста, укажите мне правильное направление.
@app.route('/login', methods=['GET','POST'])
def login():
form = Login()
if form.validate():
user=request.form['name']
passw=request.form['password']
c = g.db.execute("SELECT username from users where username = (?)", [user])
userexists = c.fetchone()
if userexists:
c = g.db.execute("SELECT password from users where password = (?)", [passw])
passwcorrect = c.fetchone()
if passwcorrect:
#session['logged_in']=True
#login_user(user)
flash("logged in")
return redirect(url_for('home'))
else:
return 'incorrecg pw'
else:
return 'fail'
return render_template('login.html', form=form)
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('home'))
Меня
class User():
def __init__(self,name,email,password, active = True):
self.name = name
self.email = email
self.password = password
self.active = active
def is_authenticated():
return True
#return true if user is authenticated, provided credentials
def is_active():
return True
#return true if user is activte and authenticated
def is_annonymous():
return False
#return true if annon, actual user return false
def get_id():
return unicode(self.id)
#return unicode id for user, and used to load user from user_loader callback
def __repr__(self):
return '<User %r>' % (self.email)
def add(self):
c = g.db.execute('INSERT INTO users(username,email,password)VALUES(?,?,?)',[self.name,self.email,self.password])
g.db.commit()
Моя база данных
import sqlite3
import sys
import datetime
conn = sqlite3.connect('data.db')#create db
with conn:
cur = conn.cursor()
cur.execute('PRAGMA foreign_keys = ON')
cur.execute("DROP TABLE IF EXISTS posts")
cur.execute("DROP TABLE IF EXISTS users")
cur.execute("CREATE TABLE users(id integer PRIMARY KEY, username TEXT, password TEXT, email TEXT)")
cur.execute("CREATE TABLE posts(id integer PRIMARY KEY, body TEXT, user_id int, FOREIGN KEY(user_id) REFERENCES users(id))")
Я также настроил LoginManager в моемinit . Я не знаю, что делать дальше, но я знаю, что должен как-то настроить это
@login_manager.user_loader
def load_user(id):
return User.query.get(id)
Как настроить эту часть кода для работы с моей базой данных?
Правка: пожалуйста дайте мне знать, если это выглядит правильно или может быть улучшено:)
@login_manager.user_loader
def load_user(id):
c = g.db.execute("SELECT id from users where username = (?)", [id])
userid = c.fetchone()
return userid
@app.route('/login', methods=['GET','POST'])
def login():
form = Login()
if form.validate():
g.user=request.form['name']
g.passw=request.form['password']
c = g.db.execute("SELECT username from users where username = (?)", [g.user])
userexists = c.fetchone()
if userexists:
c = g.db.execute("SELECT password from users where password = (?)", [g.passw])
passwcorrect = c.fetchone()
if passwcorrect:
user = User(g.user, 'email', g.passw)
login_user(user)
flash("logged in")
return redirect(url_for('home'))
else:
return 'incorrecg pw'
else:
return 'fail'
return render_template('login.html', form=form)
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('home'))
import sqlite3
from flask import g
class User():
def __init__(self,name,email,password, active = True):
self.name = name
self.email = email
self.password = password
self.active = active
def is_authenticated(self):
return True
#return true if user is authenticated, provided credentials
def is_active(self):
return True
#return true if user is activte and authenticated
def is_annonymous(self):
return False
#return true if annon, actual user return false
def get_id(self):
c = g.db.execute('SELECT id from users where username = (?)', [g.user])
id = c.fetchone()
return unicode(id)
#return unicode id for user, and used to load user from user_loader callback
def __repr__(self):
return '<User %r>' % (self.email)
def add(self):
c = g.db.execute('INSERT INTO users(username,email,password)VALUES(?,?,?)',[self.name,self.email,self.password])
g.db.commit()
3 ответа:
Функция обратного вызова User_loader-это способ указать Flask-Login на "как" искать идентификатор пользователя из базы данных ? Поскольку вы используете sqllite3, вам необходимо реализовать функцию user_loader для запроса базы данных sqllite и извлечения/возврата сохраненного идентификатора пользователя/имени пользователя. Что-то вроде:
@login_manager.user_loader def load_user(id): c = g.db.execute("SELECT username from users where username = (?)", [id]) userrow = c.fetchone() userid = userrow[0] # or whatever the index position is return useridКогда вы вызываете login_user (user), он вызывает функцию load_user для определения идентификатора пользователя.
Вот как работает поток процесса:
Вы подтверждаете это пользователь ввел правильное имя пользователя и пароль, сверившись с базой данных.
Если имя пользователя / пароль совпадают, то вам нужно извлечь пользовательский "объект" из идентификатора пользователя. ваш объект пользователя может быть userobj = User(userid, email..и т.д.). Просто создайте его.
Войдите в систему пользователя, вызвав login_user (userobj).
Перенаправление везде, вспышки и т. д.
Вы случайно не используете SQLAlchemy? Вот пример моей работы: model.py для проекта, который я имел некоторое время назад, который использовал sqlite3 & Flask Login-ins.
USER_COLS = ["id", "email", "password", "age"]Вы создали двигатель?
engine = create_engine("sqlite:///ratings.db", echo=True) session = scoped_session(sessionmaker(bind=engine, autocommit=False, autoflush=False)) Base = declarative_base() Base.query = session.query_property() Base.metadata.create_all(engine)Вот пример пользовательского класса:
Надеюсь, это поможет вам получить хоть какую-то подсказку.class User(Base): __tablename__ = "Users" id = Column(Integer, primary_key = True) email = Column(String(64), nullable=True) password = Column(String(64), nullable=True) age = Column(Integer, nullable=True) def __init__(self, email = None, password = None, age=None): self.email = email self.password = password self.age = age
Используйте SQLAlchemy он полностью обрабатывает все запросы для вас, так что вам не нужно записывать все это.
Но если вы продолжите использовать его таким образом, то ваша функция user_loader должна создать объект класса" User". Например:
userrow = c.fetchone() username = userrow[0] u = User(username=username) return u