无法使用 Apache Airflow 中的 FTP 挂钩连接到 FTP 服务器

Can't connect to FTP server using FTPHook in Apache Airflow

我正在尝试在 Apache Airflow 中使用 FTPHook class。以下是以ftp.gnu.org为例的测试代码:

from airflow.contrib.hooks.ftp_hook import FTPHook
hook = FTPHook('gnu')
print(hook.list_directory(''))

这段代码returns错误:

{base_hook.py:84} INFO - Using connection to: id: gnu. Host: ftp.gnu.org, Port: None, Schema: None, Login: None, Password: None, extra: {}
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    print(hook.list_directory(''))
  File "/home/ubuntu/.anaconda3/envs/airflow/lib/python3.7/site-packages/airflow/contrib/hooks/ftp_hook.py", line 127, in list_directory
    conn.cwd(path)
  File "/home/ubuntu/.anaconda3/envs/airflow/lib/python3.7/ftplib.py", line 631, in cwd
    return self.voidcmd(cmd)
  File "/home/ubuntu/.anaconda3/envs/airflow/lib/python3.7/ftplib.py", line 278, in voidcmd
    return self.voidresp()
  File "/home/ubuntu/.anaconda3/envs/airflow/lib/python3.7/ftplib.py", line 251, in voidresp
    resp = self.getresp()
  File "/home/ubuntu/.anaconda3/envs/airflow/lib/python3.7/ftplib.py", line 246, in getresp
    raise error_perm(resp)
ftplib.error_perm: 530 Please login with USER and PASS.

然而,如果我们将这行代码 hook.get_conn().login() 放在 print 函数之前,一切正常。这是一个错误还是我做错了什么?

感谢 Slack 中的 Apache Airflow 社区,我们可以通过在 Airflow GUI 平台中设置正确的用户名和密码来解决问题。虽然我试图以匿名用户身份连接,但有必要设置 username = 'anonymous'password = 'anonymous@'.这似乎是 ftplib 的默认设置,正如 docs 的第一个示例中所示,但 Airflow 将这些值更改为 None 如果您将它们留空。