Téléchargement de Python GAE sur Google Docs
-
11-12-2019 - |
Question
Je dois télécharger un fichier/document sur Google Docs sur une application GAE.Cela devrait être assez simple, mais j'ai beaucoup de problèmes avec l'API.
Le contexte:
import gdata.docs.service
client = gdata.docs.service.DocsService()
client.ClientLogin('gmail', 'pass')
ms = gdata.MediaSource(#what goes in here?)
client.Upload(media_source=ms, title='title')
Pour télécharger, j'utilise client.Upload()
, qui prend un objet MediaSource (wrapper) comme paramètre.Cependant, MediaSource()
semble n'accepter qu'un chemin de fichier pour un document : 'C:/Docs/ex.doc'
.
Comme je suis sur GAE sans système de fichiers, je ne peux accéder au fichier que via le Blobstore ou une URL directe vers le fichier.Mais comment puis-je saisir cela dans MediaSource()
?
Il semble y avoir un façon en Java pour y parvenir en utilisant MediaByteArraySource()
, mais rien pour Python.
La solution
Si quelqu'un est curieux, voici comment j'ai résolu ce problème à l'aide de l'API Document List.
Je ne voulais pas utiliser le SDK de lecteur car cela complique beaucoup de choses.C'est beaucoup plus simple avec l'API List de simplement s'authentifier/se connecter sans avoir recours à des astuces OAuth.Ceci utilise la version 2.0.14 du bibliothèque Python gdata, qui n'est pas la version actuelle (2.0.17), mais elle semble avoir un mécanisme de téléchargement plus simple.
Il existe également un peu plus de documentation en ligne (encore rare) pour la version 2.0.14, même si j'ai dû la reconstituer à partir de diverses sources et d'essais et d'erreurs.L'inconvénient est que vous ne pouvez pas télécharger de PDF avec cette version.Ce code Ne fera pas travailler avec 2.0.17.
Voici le code :
import gdata.docs.service
import gdata.docs.data
from google.appengine.api import urlfetch
# get file from url
result = urlfetch.fetch('http://example.com/test.docx')
headers = result.headers
data = result.content
# authenticate client object
client = gdata.docs.service.DocsService()
client.ClientLogin('gmail', 'password')
# create MediaSource file wrapper
ms = gdata.MediaSource(file_handle=result.content,
content_type=headers['content-type'],
content_length=int(headers['content-length']))
# upload specific folder, return URL of doc
google_doc_name = 'title'
folder_uri = '/feeds/folders/private/full/folder:j7XO8SJj...'
entry = client.Upload(ms, google_doc_name, folder_or_uri=secret.G_FOLDER_URI)
edit_url = entry.GetAlternateLink().href
Autres conseils
La documentation du SDK Google Drive comprend un exemple d'application complet écrit en Python qui s'exécute sur App Engine :
https://developers.google.com/drive/examples/python
Vous pouvez l'utiliser comme référence pour votre implémentation et pour voir comment enregistrer un fichier depuis App Engine.