我使用这个包:https://github.com/anchitarnav/flask-login-gcp-datastore ...使用GCP数据存储区(而不是SQL数据库)。
我可以添加用户,但当我登录时,'is_authenticated'属性总是false。我还不明白在flask_login代码中如何设置'is_authenticated'。也许对flask_login了解更多的人可以提供一些见解。
这篇文章(Flask Login login_user not setting is_authenticated)建议应该在User模型中添加一个“authenticated”字段,但这对我来说似乎不正确。看起来flask_login通常应该设置'is_authenticated'属性。
也有可能我没有正确使用flask-login-gcp-datastore包。文件很少。
这是在App Engine上从Python 2升级到Python3的努力的一部分。
谢谢你
下面是我的代码:
init.py
from flask import Flask
##from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
# init SQLAlchemy so we can use it later in our models
##db = SQLAlchemy()
def create_app():
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret-key-goes-here'
##app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'
##db.init_app(app)
login_manager = LoginManager()
login_manager.login_view = 'auth.login'
login_manager.init_app(app)
from .project.models import User
@login_manager.user_loader
def load_user(user_id):
# since the user_id is just the primary key of our user table, use it in the query for the user
##return User.query.get(int(user_id))
print("before get user")
u = User.get(int(user_id))
print(u.is_authenticated)
return u
##return User.get(int(user_id))
from .project.auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint)
from .project.main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .main import home_api as home_blueprint
app.register_blueprint(home_blueprint)
from .eventSupport import events_api as events_blueprint
app.register_blueprint(events_blueprint)
return app
验证码
from flask import Blueprint, render_template, redirect, url_for, request
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import login_user, current_user
from .models import ndb, User
client = ndb.Client()
auth = Blueprint('auth', __name__)
@auth.route('/login')
def login():
template_values = {
'user': 'Fred',
}
return render_template('login.html',**template_values)
@auth.route('/login', methods=['POST'])
def login_post():
# login code goes here
email = request.form.get('email')
password = request.form.get('password')
remember = True if request.form.get('remember') else False
##user = User.query.filter_by(email=email).first()
with client.context():
query = ndb.gql("SELECT * FROM User WHERE email = :1", email)
user = query.get()
# check if the user actually exists
# take the user-supplied password, hash it, and compare it to the hashed password in the database
if not user or not check_password_hash(user.password, password):
##flash('Please check your login details and try again.')
print('login failed')
return redirect(url_for('auth.login')) # if the user doesn't exist or password is wrong, reload the page
print('before login')
result = login_user(user, remember=remember)
print(result)
if not current_user.is_active:
print("user not active")
print(current_user.is_anonymous)
print(current_user.get_id())
return redirect(url_for('main.profile'))
main.py
from flask import Blueprint, render_template
from flask_login import login_required, current_user
##from . import db
main = Blueprint('main', __name__,template_folder="templates")
@main.route('/')
def index():
return render_template('home.html')
@main.route('/profile')
##@login_required
def profile():
print("profile start")
if not current_user.is_active:
print("user is inactive")
if not current_user.is_authenticated:
print("user is not authenticated")
if current_user.is_anonymous:
print("user is anonymous")
print(current_user.get_id())
print("profile end")
return render_template('profile.html',name=current_user.name)
models.py
from google.cloud import ndb
from google.cloud.ndb.context import get_context
from flask_login_user.gcp.datastore.config import get_db_client
from flask_login_user.gcp.datastore.caching import cached
from flask_login_user.gcp.datastore.user import User
1条答案
按热度按时间xdnvmnnf1#
原来包裹有问题。我将其缩减为仅使用以下内容:
...它现在工作正常-- 'is_authenticated'正在按预期设置。