Python Flask Security,在Blueprint中实现Security_可跟踪功能

Python Flask Security,在Blueprint中实现Security_可跟踪功能,python,flask,flask-security,Python,Flask,Flask Security,我正在使用SECURITY\u TRACKABLE功能来实现Flask安全性,并且在我的自定义API登录请求处理程序中,我试图确保按照 我的登录代码在蓝图中: from modules.auth.models import User from flask import Blueprint, request, abort from flask_restful import Api, Resource from flask_security import login_required from fl

我正在使用
SECURITY\u TRACKABLE
功能来实现Flask安全性,并且在我的自定义API登录请求处理程序中,我试图确保按照

我的登录代码在蓝图中:

from modules.auth.models import User
from flask import Blueprint, request, abort
from flask_restful import Api, Resource
from flask_security import login_required
from flask_security.utils import verify_password, login_user, logout_user 

app = Blueprint(__name__, __name__)
api = Api(app)

class LogResource(Resource):
    """
    Manages user login and logout
    """

    def post(self):
        user = User.query.filter_by(
            email = request.form['email']
        ).first()
        if not user:
            abort(401, "Wrong credentials.")

        if verify_password(request.form['password'], user.password):
            login_user(user)
            app.security.datastore.commit()
            return "Logged in"
        else:
            abort(401, description="Wrong credentials.")
但是当用户登录时,我得到了一个错误:
AttributeError:“Blueprint”对象没有属性“security”
,因为我在Blueprint中,而不是应用程序中。如何解决此问题?

安全()对象从来不是Flask应用程序对象的直接属性。这里的错误是,
app
是一个
Blueprint
对象,这更让人困惑。您通常不应该对blueprint对象使用
app

您可以从首先创建
安全(…)
实例的模块中导入对象,也可以通过Flask
extensions
映射通过:

接下来,您通常希望在响应完成后提交访问,因为这有助于为最终用户生成更快的结果,并允许您记录响应状态。使用在响应后运行提交:

from flask import current_app, after_this_request

def flask_security_datastore_commit(response=None):
    datastore = current_app.extensions['security'].datastore
    datastore.commit()
    return response
在您看来,请使用:

if verify_password(request.form['password'], user.password):
    login_user(user)
    after_this_request(flask_security_datastore_commit)
    return "Logged in"
Security()
对象从来不是Flask应用程序对象的直接属性。这里的错误是,
app
是一个
Blueprint
对象,这更让人困惑。您通常不应该对blueprint对象使用
app

您可以从首先创建
安全(…)
实例的模块中导入对象,也可以通过Flask
extensions
映射通过:

接下来,您通常希望在响应完成后提交访问,因为这有助于为最终用户生成更快的结果,并允许您记录响应状态。使用在响应后运行提交:

from flask import current_app, after_this_request

def flask_security_datastore_commit(response=None):
    datastore = current_app.extensions['security'].datastore
    datastore.commit()
    return response
在您看来,请使用:

if verify_password(request.form['password'], user.password):
    login_user(user)
    after_this_request(flask_security_datastore_commit)
    return "Logged in"

您在这里引用的是
app
,但例外情况是它是一个蓝图。
app
在您的代码中是如何定义的?或者换一种说法,您是否可以显示一个完整的回溯,以显示引发异常的行?指向Flask Security的链接指向API文档的Utils部分。这不是一个真正有用的链接,因为你的功能没有任何内容。
app
是在app.py中定义的,我不知道如何访问它。Utils部分的第一个元素描述了如何将跟踪功能与登录功能结合使用,但不太清楚你在这里引用的是
app
,但例外情况是,这是一个蓝图。
app
在您的代码中是如何定义的?或者换一种说法,您是否可以显示一个完整的回溯,以显示引发异常的行?指向Flask Security的链接指向API文档的Utils部分。这不是一个真正有用的链接,由于您的功能没有任何相关内容。
app
是在app.py中定义的,我不知道如何访问它。Utils部分的第一个元素介绍了如何将跟踪功能与登录功能结合使用,但不太清楚。我认为这是解决方案,但在测试后,我发现另一个错误
AttributeError:“\u SecurityState”对象没有属性“commit”
@andrea56:mea culpa,不确定为什么应该存在的
.datastore
引用被省略。我认为这是解决方案,但在测试后,我得到另一个错误
AttributeError:“\u SecurityState”对象没有属性“commit”
@andrea56:mea culpa,不确定为什么省略了本应存在的
.datastore
引用。