【问题标题】:Testing a decorated API route in Flask在 Flask 中测试修饰的 API 路由
【发布时间】:2018-02-14 15:29:18
【问题描述】:

我有以下简单的控制器

@companies.route('/companies/<int:id>', methods=['GET'])
@inject_repository(CompanyRepository)
def get_company(repository, id):
    """
    GET /companies/id
    """
    company = repository.get(pk=id)
    return jsonify(company.to_json())

DAO 被@inject_repository(CompanyRepository)注入

但是,我不知道测试时发生了什么:

def test_get_company(self):

    response = self.client.get(url_for('companies.get_company', id=1))
    data = json.loads(response.get_data(as_text=True))

    assert_equal(response.status_code, 200)

我收到以下错误

TypeError: get_company() missing 1 required positional argument: 'id'

控制器不是被装饰了吗?


装饰器代码

def inject_repository(repository_class):

    def decorator(func):

        @wraps(func)
        def wrapper(*args, **kwargs):

            if 'psql' in class_init_fields(repository_class):
                repository = psql_repository_for(
                    repository_model=repository_class,
                    connection_meta=current_app.config['POSTGRESQL'])

            else:
                raise ValueError("'{}' repository cannot be injected".format(repository_class.__name__))

            return func(repository=repository)

        return wrapper

    return decorator

【问题讨论】:

  • inject_repository 来自哪里?可以出示一下代码吗?
  • 我编辑了@DanielRoseman

标签: python flask python-decorators


【解决方案1】:

你没有将参数从你的装饰器传递给被装饰的函数。

def wrapper(*args, **kwargs):
    ...
    kwargs['repository'] = repository
    return func(*args, **kwargs)

【讨论】:

  • 是的,你是对的,感谢@DanielRoseman 的帮助,为什么 API 工作正常呢?测试时刚刚抛出异常。
猜你喜欢
  • 2019-07-09
  • 1970-01-01
  • 2021-02-06
  • 2018-06-05
  • 1970-01-01
  • 2021-11-27
  • 2012-06-19
  • 1970-01-01
  • 2018-11-09
相关资源
最近更新 更多