簡體   English   中英

無法從App Engine中的FTP服務器下載CSV文件

[英]unable to dowload csv file from FTP server in app engine

我正在嘗試從AppEngine中的ftp服務器讀取CSV文件,並且能夠連接到ftp服務器。 但是,當我嘗試檢索文件時,它返回了錯誤。 這是我的代碼,用於從服務器讀取CSV文件:

import ftplib
import cStringIO
import csv

session = ftplib.FTP('myftpserver.com')
session.login('username','pwd')
session.set_pasv(False)

output = cStringIO.StringIO()

session.retrbinary('RETR myfile.csv', output.write)
csvfile = csv.reader(output.getvalue().splitlines(), delimiter=',')

for i, row in enumerate(csvfile):
    print row

這是我得到的錯誤的追溯:

  Traceback (most recent call last):
  File "/home/vikas/apps/myproj/django/core/handlers/base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/home/vikas/apps/myproj/admin/admin_actions.py", line 3528, in get_ftp_file
    session.retrbinary('RETR myfile.csv', output.write)
  File "/usr/lib/python2.7/ftplib.py", line 414, in retrbinary
    conn = self.transfercmd(cmd, rest)
  File "/usr/lib/python2.7/ftplib.py", line 376, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "/usr/lib/python2.7/ftplib.py", line 354, in ntransfercmd
    sock = self.makeport()
  File "/usr/lib/python2.7/ftplib.py", line 283, in makeport
    for res in socket.getaddrinfo(None, 0, self.af, socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
  File "/home/vikas/gcloud/google-cloud-sdk/platform/google_appengine/google/appengine/api/remote_socket/_remote_socket.py", line 318, in getaddrinfo
    raise gaierror(EAI_NONAME, 'nodename nor servname provided, or not known')
gaierror: [Errno 8] nodename nor servname provided, or not known

我不知道我做錯了什么,像dir() nlst()等命令都無法正常工作,並且在我添加它們后就發生了上述錯誤。

可惜的是,目前的App Engine提供的插座模擬不太好到足以覆蓋所有用例。

這是一個訪問著名的公共匿名FTP服務器並從中獲取一個小的文本文件的示例,以便每個人都可以重現和實驗...:在文件getit.py ,我們具有:

import ftplib
import cStringIO

def getit():
    session = ftplib.FTP('ftp.mozilla.org')
    session.login('anonymous','')
    # session.set_pasv(False)
    session.cwd('/pub/mozilla.org')

    output = cStringIO.StringIO()
    session.retrbinary('RETR README', output.write)

    return output.getvalue()

if __name__ == '__main__':
    print(getit())

無論您將set_pasv留在此處,還是刪除注釋,它都可以作為獨立的python getit.py運行良好。

要將其嵌入到GAE應用中,例如:

import getit
class GetitPage(webapp2.RequestHandler):
  def get(self):  # pylint:disable-msg=invalid-name
     try: result = getit.getit()
     except Exception as e:
         result = 'Error {}: {}'.format(type(e), e)
     self.response.headers['Content-Type'] = 'text/plain'
     self.response.out.write(result)

使用set_pasv左注釋,這可以正常工作,但是如果set_pasv注釋,則基本上會收到與您相同的異常。

因此,將FTP發送到強制您進入主動模式(不支持被動模式)的服務器將無法以這種方式工作。 但是,那一台相當破損的服務器-您能否對其進行修復以使其支持流行的默認被動模式? 這樣您的GAE應用程序就可以快樂地使用它了!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM