ユーザーがログインすると、ログインしていないという問題があります。ログインしたユーザーをリダイレクトするためのログインページに条件がありますしかし、それは動作していないようです。FlaskにSqlite3を使用してユーザーログイン(ログインマネージャー)を実装しようとしています
たとえば、ログイン後、ユーザーがログインページを再読み込みすると、再度ログインするように求められます。 @login_requiredを自分のルートに追加すると、不正なアクセスエラーが発生します。
私には何が欠けていますか?
ユーザークラス:
class User(UserMixin):
def __init__(self, username, password, email):
self.username = username.lower()
self.password = password
self.email = email
def is_authenticated():
return True
def is_active():
return True
def is_annonymous():
return False
def get_id(self):
conn = connect_db()
conn.row_factory = sqlite3.Row
curs = conn.cursor()
curs.execute('select uid from user where username = (?)', [self.username])
return unicode(curs.fetchone())
def add_db(self):
curs = g.db.cursor()
curs.execute('insert into user(username, password, email) values (?, ?, ?)', [self.username, self.password, self.email])
g.db.commit()
再生回数:
@app.route('/login', methods = ['GET', 'POST'])
def login():
print('testttttttttttttttttttttt' + str(g.user.get_id()))
if g.user is not None and g.user.is_authenticated:
return redirect(url_for('index'))
form = LoginForm()
if request.method == 'POST' and form.validate_on_submit():
#session['remember_me'] = form.remember_me.data
g.username = form.username.data
g.password = form.password.data
user_db = fetch_user(g.username)
if user_db is not None:
if g.password == user_db[2]:
user = User(user_db[1], user_db[2], user_db[3])
login_user(user, remember = form.remember_me.data)
flash('Login successful!')
return redirect(url_for('index'))
else:
flash('Incorrect password.')
return redirect(url_for('login'))
else:
flash('No such user exists.')
return redirect(url_for('login'))
return render_template('login.html', title = 'Sign In', form = form)
@lm.user_loader
def load_user(id):
conn = connect_db()
conn.row_factory = sqlite3.Row
curs = conn.cursor()
curs.execute('select * from user where uid = (?)', [id])
return curs.fetchone()
@app.before_request
def before_request():
g.db = connect_db()
g.user = current_user
@app.teardown_request
def teardown_request(error):
if hasattr(g, 'db'):
g.db.close()
Let me know if I need to post some other part of my code.
編集 - は、User
クラスのインスタンスを返すようにload_user
方法を作ったが、今私は別のエラーを取得します。
コード - https://codeshare.io/svdIa
何らかの理由で、g.userとCURRENT_USERオブジェクトが 文字列ではなく、Userクラスのインスタンスとして認識されています。 login_userメソッドの最初の2行でも同じエラーが生成されます。
エラートレース:
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 2000, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1991, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1567, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1988, in wsgi_app
response = self.full_dispatch_request()
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1641, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1544, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1639, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1625, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Python27\asset\flask\lib\site-packages\flask_login.py", line 790, in decorated_view
elif not current_user.is_authenticated:
File "C:\Python27\asset\flask\lib\site-packages\werkzeug\local.py", line 343, in __getattr__
return getattr(self._get_current_object(), name)
AttributeError: 'str' object has no attribute 'is_authenticated'
私はSqlite3でユーザーログインを実装するためにこの質問を参照しました - http://stackoverflow.com/questions/38177548/trying-to-implement-user-loginlogin-manager-with-sqlite3-in-flask –