GCloud Upload httplib2.RedirectMissingLocation: перенаправлено, но в ответе отсутствует заголовок Location: - PullRequest
7 голосов
/ 20 января 2020

Я пытаюсь загрузить небольшой файл в gcloud, используя простую python программу

client = storage.Client(project=GCLOUD_PROJECT)
bucket = client.get_bucket(GCLOUD_BUCKET)
blob = bucket.blob(GCLOUD_FILE_ON_CLOUD)
blob.upload_from_filename(GCLOUD_FILE_LOCAL)

Она работала до недавнего времени, и что-то изменилось. Теперь, когда я загружаю файл размером более 5 МБ, я получаю сообщение об ошибке ниже. Файлы меньше или равные 5 МБ. Размер не достаточно велик для реализации возобновляемой загрузки, не так ли?

Traceback (most recent call last):
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/gcloud_upload.py", line 40, in <module>
    blob.upload_from_filename(GCLOUD_FILE_LOCAL)
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/venv36/lib/python3.6/site-packages/gcloud/storage/blob.py", line 597, in upload_from_filename
    encryption_key=encryption_key, client=client)
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/venv36/lib/python3.6/site-packages/gcloud/storage/blob.py", line 543, in upload_from_file
    http_response = upload.stream_file(use_chunks=True)
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/venv36/lib/python3.6/site-packages/gcloud/streaming/transfer.py", line 1086, in stream_file
    response = send_func(self.stream.tell())
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/venv36/lib/python3.6/site-packages/gcloud/streaming/transfer.py", line 1215, in _send_chunk
    return self._send_media_request(request, end)
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/venv36/lib/python3.6/site-packages/gcloud/streaming/transfer.py", line 1125, in _send_media_request
    self.bytes_http, request, retries=self.num_retries)
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/venv36/lib/python3.6/site-packages/gcloud/streaming/http_wrapper.py", line 423, in make_api_request
    check_response_func=check_response_func)
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/venv36/lib/python3.6/site-packages/gcloud/streaming/http_wrapper.py", line 371, in _make_api_request_no_retry
    redirections=redirections, connection_type=connection_type)
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/venv36/lib/python3.6/site-packages/oauth2client/transport.py", line 175, in new_request
    redirections, connection_type)
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/venv36/lib/python3.6/site-packages/oauth2client/transport.py", line 282, in request
    connection_type=connection_type)
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/venv36/lib/python3.6/site-packages/httplib2/__init__.py", line 1986, in request
    cachekey,
  File "/Users/mmumshad/PycharmProjects/quiz-python-flask-angular/venv36/lib/python3.6/site-packages/httplib2/__init__.py", line 1685, in _request
    content,
httplib2.RedirectMissingLocation: Redirected but the response is missing a Location: header.

Когда я отлаживаю, я вижу ниже.

{
 'content-type': 'text/plain; charset=utf-8', 
 'range': 'bytes=0-1048575', 
 'content-length': '0', 
 'date': 'Sun, 19 Jan 2020 23:52:13 GMT', 
 'server': 'UploadServer', 
 'alt-svc': 'quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000', 
 'status': '308'}

Мой список пипсов для справки. ОС - MA C OSx. Я также проверил на Linux. Та же проблема.

adal                     1.2.2    
bson                     0.5.8    
cachetools               3.1.1    
certifi                  2019.9.11
cffi                     1.13.1   
chardet                  3.0.4    
cryptography             2.8      
dnspython                1.16.0   
gcloud                   0.18.3   
gitdb2                   2.0.6    
GitPython                3.0.5    
google-auth              1.6.3    
googleapis-common-protos 1.51.0   
httplib2                 0.16.0   
idna                     2.7      
itsdangerous             1.1.0    
MarkupSafe               1.1.1    
oauth2client             4.1.3    
oauthlib                 3.1.0    
pip                      19.0.3   
protobuf                 3.11.2   
pyasn1                   0.4.7    
pyasn1-modules           0.2.7    
pycparser                2.19     
PyJWT                    1.7.1    
python-dateutil          2.8.0    
requests                 2.19.1   
requests-oauthlib        1.2.0    
rsa                      4.0      
setuptools               40.8.0   
six                      1.12.0   
smmap2                   2.0.5    
urllib3                  1.23     
websocket-client         0.56.0   
Werkzeug                 0.16.0   

Это работало на прошлой неделе. Что-то изменилось в последнее время?

Ответы [ 4 ]

7 голосов
/ 22 января 2020

Solutions

gcloud пакет устарел дважды и не совместим с httplib2>=0.16. Правильное решение - использовать google-cloud-* семейство пакетов.

google-api-python-client>=1.7.12 использует API redirect_codes, пожалуйста, обновите, оно просто работает.

httplib2 v0.17.0 только что выпущен с возможностью изменения набора кодов ответов, рассматриваемых как перенаправления. Это лучший вариант, если вы можете изменить код, который создает объект Http:

http = httplib2.Http()
http.redirect_codes = http.redirect_codes - {308}

Если это невозможно, отредактируйте файл require.txt, чтобы зафиксировать httplib2<0.16.0


Длинная история

сервер облачного хранения Google использует HTTP 308 для специальной функции возобновляемых загрузок , которая несколько напоминает «повторить тот же метод в том же месте», но не совсем.

Выше (вероятно) обоснование для пакета PyPI google-resumable-media , который используется более поздними воплощениями связанных с gcloud пакетов и обрабатывает 200 и 308 аналогичным образом, в отличие от generi c HTTP-клиент должен.

Контекст истории:

Извините за плохие новости. Как энтузиаст HTTP, я склонен к поддержке 308. Пожалуйста, дайте понять, если у вас есть идея, как лучше справиться с этой ситуацией.

6 голосов
/ 20 января 2020

Понизьте версию httplib2 до 0.15.0. Работал у меня на python google-cloud-sdk.

1 голос
/ 13 апреля 2020

Я решил эту проблему с:

pip install httplib2==0.15.0

pip install google-api-python-client==1.6
0 голосов
/ 13 марта 2020

У меня была эта ошибка в потоке данных (маскирующаяся также под BrokenPipe). Понижение google-api-python-client до версий >=1.7.8,<1.7.12 исправило это, потому что в 1.7.12 появилась зависимость от httplib2 0.17.0, которая была как-то несовместима.

...