【问题标题】:Flask Assertion Error using multiple blueprints使用多个蓝图的 Flask 断言错误
【发布时间】:2021-05-14 04:01:58
【问题描述】:

编辑:所以经过多一点挖掘之后,问题似乎(如果这是一个问题,可能是出于我无法理解的原因是故意的)与 Flask-Cognito (我用来通过 AWS 处理用户身份验证的 lib)有关- 我的许多路线都有装饰器@cognito_auth_required@cognito_group_permissions(['admin']),但似乎我不能将其应用于每个蓝图超过 1 条路线。然而,蓝图上的多条路线需要仅限于管理员用户。有没有办法可以跨多个路由应用这些装饰器?

更新代码以提供上下文。

-- 结束编辑--

抱歉,如果这是一个菜鸟问题,我对 Flask 还很陌生。

我正在编写一个 RESTful API,我正在注册多个蓝图以尝试保持代码干净,但是,当我尝试在本地运行我的程序时,我不断收到 AssertionError: View function mapping is overwriting an existing endpoint function: products.wrapper 消息。此错误仅在我实施第二个蓝图时才开始出现。

所有蓝图都是这样注册的:

api_base_url = '/api/v1'
app.register_blueprint(products, url_prefix=api_base_url+'/products')
app.register_blueprint(categories, url_prefix=api_base_url+'/categories')

if __name__ == "__main__":
    application = app
    application.debug = True
    application.run()

在我的routes.py 文件中:

.. code omitted, Product + Category models imported from models ... 

@products.route('/create', methods=['POST'])
@cognito_auth_required
@cognito_group_permissions(['admin'])
def products_create():
    # code omitted for readability
    return jsonify(error=False, message='New product created')
    
@categories.route('/create', methods=['POST'])
@cognito_auth_required
@cognito_group_permissions(['admin'])
def categories_create():
    # code omitted for readability
    return jsonify(error=False, message='New category created')

最初我让路由都指向两个不同的def all(): 函数,但我更改了它,希望多个具有相同名称的函数是问题所在,但无济于事。我不确定是什么导致了这个端点冲突——每个蓝图都有自己的 URL 前缀,所以它应该减轻端点冲突,但也许不是这种情况?是否有可能,因为蓝图是在程序启动之前注册的,所以它没有在检查冲突之前添加 URL 前缀?

任何帮助将不胜感激。干杯。

【问题讨论】:

    标签: python rest flask


    【解决方案1】:

    好的,所以我想通了 - 装饰器 @cognito_group_permissions 似乎没有包装函数。为了让它工作,我创建了 decorators.pyfunctools 导入的包装,并修改了来自 flask_cognito 的代码:

    原文:

    def cognito_check_groups(groups: list):
        def decorator(function):
            def wrapper(*args, **kwargs):
                _cognito_check_groups(groups)
                return function(*args, **kwargs)
    
            return wrapper
    
        return decorator
    

    装饰器.py:

    from functools import wraps
    from flask_cognito import _cognito_check_groups
    
    def cognito_in_groups(groups: list):
        def decorator(function):
            @wraps(function)
            def wrapper(*args, **kwargs):
                _cognito_check_groups(groups)
                return function(*args, **kwargs)
            return wrapper
        return decorator
    

    然后我导入我的路线并使用更新的装饰器,现在一切正常:

    from decorators import cognito_in_groups
    @products.route('/create', methods=['POST'])
    @cognito_auth_required
    @cognito_in_groups(['admin'])
    def products_create():
        try:
            # code omitted...
            return jsonify(error=False, message='New product created')
        except IntegrityError:
            return jsonify(error=True, message='Duplicate SKU detected')
    

    离开这里以防其他人遇到类似问题。

    很好奇 cognito_auth_required 被包装但 cognito_check_groups 没有被包装,如果有人能阐明原因,我很想知道。

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      相关资源
      最近更新 更多