Wenn Sie von boto aus auf Google Cloud Storage zugreifen, können Sie mit dem Zugriffsschlüssel und dem geheimen Schlüssel darauf zugreifen, indem Sie den kompatiblen Betriebszugriff mit s3 aktivieren. http://qiita.com/itkr/items/d990e87a2540332ee0e5
Bei dieser Methode gibt es jedoch ein Problem. Der Zugriffsschlüssel, der mit einem kompatiblen Betriebszugriff ausgestellt werden kann, ist mit dem Google-Benutzerkonto verknüpft, was für Projekte mit mehreren Personen unpraktisch ist. Anschließend haben Sie die Möglichkeit, mit einem Dienstkonto und einer Schlüsseldatei (S. 12) darauf zuzugreifen.
Hier verwenden wir eine Bibliothek namens gcs-oauth2-boto-plugin.
pip install gcs-oauth2-boto-plugin
Bereiten Sie eine Konfigurationsdatei vor, die das Dienstkonto und den Pfad der Schlüsseldatei beschreibt.
Standardmäßig wird "~ / .boto" angezeigt. Sie können jedoch einen beliebigen Pfad angeben, indem Sie eine der folgenden Optionen in der Umgebungsvariablen vorbereiten. Dies ist übrigens das gleiche wie gsutil.
--BOTO_CONFIG (einzelne Datei angeben)
--BOTO_PATH (mehrere durch :
getrennte Dateien angeben)
Schreiben Sie beim Schreiben von Umgebungsvariablen in Python wie folgt.
import os
os.environ['BOTO_CONFIG'] = '/path.to/boto_config'
Sie können verschiedene Einstellungen schreiben, aber die wichtigsten sind diesmal die folgenden Einstellungen
[Credentials]
gs_service_key_file = /path.to/sample-KEYFILE.p12
gs_service_client_id = [email protected]
[GSUtil]
default_project_id = sampleproject-994
Referenz: https://cloud.google.com/storage/docs/gsutil/commands/config#additional-configuration-controllable-features
import boto
bucket_name = 'bucket_name'
uri = boto.storage_uri(bucket_name, 'gs')
print uri.get_bucket()
Grundsätzlich ist dies alles, was Sie brauchen, wenn Sie das gcs-oauth2-boto-Plugin installiert haben.
boto verfügt über einen Mechanismus, mit dem Sie beim Einfügen einer AuthConnection ein Plugin installieren können. Ich werde es weglassen, weil ich den größten Teil der Implementierung von boto erneut drucken werde, wenn ich es im Detail schreibe. Wenn Sie sich jedoch den Code für die Authentifizierung von boto ansehen, finden Sie den Aufruf der Funktion get_plugin
.
boto/plugin.py
def get_plugin(cls, requested_capability=None):
if not requested_capability:
requested_capability = []
result = []
for handler in cls.__subclasses__():
if handler.is_capable(requested_capability):
result.append(handler)
return result
__subclasses__
zeigt eine Liste von Unterklassen an, in diesem Fall handelt es sich jedoch um eine Liste von Klassen, die von der AuthHandler
-Klasse erben. Die Klasse "OAuth2ServiceAccountAuth" im gcs-oauth2-boto-Plugin erbt von "AuthHandler" und wird als Plugin erkannt. Darin werden notwendige Informationen wie "gs_service_key_file" aus der Einstellungsdatei abgerufen.
Sie können auch eine eigene Klasse implementieren, die "AuthHandler" erbt und den Pfad der darin enthaltenen Konfigurationsdatei zwangsweise überschreibt, um sie dynamisch zu ändern. Aber ich denke, es kann wahrscheinlich klüger sein.
from boto.auth_handler import AuthHandler
from boto.pyami.config import Config
boto_path = ''
class SpamAuth(AuthHandler):
def __init__(self, path, config, provider):
config = Config(path=boto_path)
# ...Abkürzung...
def spam(path='/path.to/boto_config'):
global boto_path
boto_path = path
bucket_name = 'bucket_name'
uri = boto.storage_uri(bucket_name, 'gs')
print uri.get_bucket()
Zu diesem Zeitpunkt behält die URI-Klasse (in diesem Fall "BucketStorageUri") die Verbindung im Diktat "provider_pool" bei, sobald die Verbindung hergestellt ist. Wenn Sie also die Verbindung wechseln, "del BucketStorageUri.provider_pool [" gs "]" Es scheint, dass Sie es wie "BucketStorageUri.provider_pool = {}" löschen müssen.
Recommended Posts