Airflow authentication setups fails with "AttributeError: can't set attribute"

Airflow authentication setups fails with "AttributeError: can't set attribute"

docs 中描述的 Airflow 版本 1.8 密码身份验证设置在步骤

失败
user.password = 'set_the_password'

有错误

AttributeError: can't set attribute

这是由于 SqlAlchemy 更新到版本 >= 1.2,引入了向后不兼容的更改。

您可以通过显式安装 <1.2 版的 SqlAlchemy 来解决此问题。

pip install 'sqlalchemy<1.2'

或 requirement.txt

sqlalchemy<1.2

已修复

pip install 'sqlalchemy<1.2'

我正在使用 apache-airflow 1.8.2

最好直接使用PasswordUser的新方法_set_password:

 # Instead of user.password = 'password'
 user._set_password = 'password'

如果有人好奇 SQLAlchemy 1.2 中不兼容的变化(在@DanT 的回答中提到)实际上 ,这是 SQLAlchemy 处理混合属性的方式的变化。从 1.2 开始,方法必须与原始 hybrid 具有相同的名称,这在以前是没有要求的。 Airflow 的修复非常简单。 contrib/auth/backends/password_auth.py 中的代码应该是这样改的:

@password.setter
    def _set_password(self, plaintext):
        self._password = generate_password_hash(plaintext, 12)
        if PY3:
            self._password = str(self._password, 'utf-8')

对此:

@password.setter
    def password(self, plaintext):
        self._password = generate_password_hash(plaintext, 12)
        if PY3:
            self._password = str(self._password, 'utf-8')

有关详细信息,请参阅 https://bitbucket.org/zzzeek/sqlalchemy/issues/4332/hybrid_property-gives-attributeerror