python-3.x 适应GCP的Flask登录;登录时未设置“is_authenticated”

yws3nbqq  于 2023-05-23  发布在  Python
关注(0)|答案(1)|浏览(155)

我使用这个包: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
xdnvmnnf

xdnvmnnf1#

原来包裹有问题。我将其缩减为仅使用以下内容:

from flask_login_user.gcp.datastore.config import get_db_client
class User(UserMixin,ndb.Model):
    """
    The User class that you are required to implement for flask-login
    https://flask-login.readthedocs.io/en/latest/#your-user-class
    """
    email = ndb.StringProperty(required=True)
    password = ndb.StringProperty(required=True)
    name = ndb.StringProperty(required=True)

    def get_id(self):
        """
        returns a unicode that uniquely identifies this user,
        and can be used to load the user from the user_loader callback
        :return: str: user_id
        """
        return self.key.id()

    def get(user_id: str):
        """
        Get an object of User class based on the passed user_id. returns None if user not found
        :param user_id: str: The user ID for which the User object is required
        :return: User or None
        """
        present_context = get_context(raise_context_error=False)
        if present_context:
            return User.get_by_id(id=user_id)
        else:
            with get_db_client().context():
                return User.get_by_id(id=user_id)

...它现在工作正常-- 'is_authenticated'正在按预期设置。

相关问题