Was Sie tun möchten, ist, wie der Titel sagt, so dass Sie die Einführung überspringen können.
Ich habe eine App geschrieben, um mit Google Kalender mithilfe der Google API-Clientbibliothek zu spielen. Löschen Sie die OAuth2-Clientinformationen von Google Cloud Platform als "client_secret.json" und geben Sie den ** Dateinamen ** im Argument "oauth2client.client.flow_from_clientsecrets ()" an.
Das Problem hier. Ich möchte aus Sicherheitsgründen nicht "client_secret.json" zur Git-Versionierung hinzufügen. Ich führe die App jedoch auf Heroku aus, sodass ich keine Dateien hochladen kann. (Es scheint, dass Sie Objektspeicher wie Amazon S3 verwenden sollten, aber ich habe ihn gestoppt, weil er ärgerlich ist, weil ich ihn nie verwendet habe.)
Also musste ich "client_secret.json" angeben, aber ich hatte Probleme, diese Datei auf den Heroku-Server zu stellen.
Daher möchte ich Daten vom Typ Wörterbuch in die Funktion oauth2client.client.flow_from_clientsecrets ()
anstelle von Dateiname
einfügen. Speichern Sie dann den Inhalt von "client_secret.json" in den Heroku-Umgebungsvariablen und fügen Sie ihn in die Wörterbuchdaten ein.
(Ist es wirklich schlecht, vertrauliche Informationen in Umgebungsvariablen zu setzen?)
Nachdem ich den Code geschrieben hatte, wurde mir klar, dass ich normalerweise eine Instanz von "OAuth2WebServerFlow" hätte erstellen sollen. Daher muss ich es nicht separat überschreiben, aber ich habe gelernt, dass dies auf diese Weise möglich ist, also lasse ich es.
Ich möchte ** Wörterbuchtyp ** anstelle von ** Dateiname ** in die Funktion oauth2client.client.flow_from_clientsecrets ()
einfügen.
Der Quellcode der Bibliothek sah so aus. (Das Folgende ist ein Auszug aus dem Apache-Lizenzcode von Google Inc.)
Teilweise weggelassen von oauth2client.client.py
.
@_helpers.positional(2)
def flow_from_clientsecrets(filename, scope, redirect_uri=None,
message=None, cache=None, login_hint=None,
device_uri=None, pkce=None, code_verifier=None):
try:
client_type, client_info = clientsecrets.loadfile(filename,
cache=cache)
if client_type in (clientsecrets.TYPE_WEB,
-----Folgendes wird weggelassen------
Beachten Sie, dass "Dateiname" an "clientsecrets.loadfile ()" übergeben wird. Ich habe mir auch "clientsecrets.loadfile ()" angesehen.
def loadfile(filename, cache=None):
_SECRET_NAMESPACE = 'oauth2client:secrets#ns'
if not cache:
return _loadfile(filename)
obj = cache.get(filename, namespace=_SECRET_NAMESPACE)
-----Folgendes wird weggelassen------
Wenn "Cache" nicht existiert, wird die Verarbeitung an die Funktion "_loadfile" übertragen. Werfen wir einen Blick auf _loadfile
.
def _loadfile(filename):
try:
with open(filename, 'r') as fp:
obj = json.load(fp)
except IOError as exc:
raise InvalidClientSecretsError('Error opening file', exc.filename,
exc.strerror, exc.errno)
return _validate_clientsecrets(obj)
Ich bin zu der Funktion gekommen, die die Datei lädt. Wenn Sie diese Funktion überschreiben, können Sie einen Wörterbuchtyp in das Argument "Dateiname" einfügen.
Also danach mein Code
# `client.flow_from_clientsecrets`Funktionen können den Wörterbuchtyp als Argumente verwenden
# `clientsecrets._loadfile`Funktion überschreiben
def new_loadfile(data):
return clientsecrets._validate_clientsecrets(data)
clientsecrets._loadfile = new_loadfile
Danach
flow = client.flow_from_clientsecrets(
Wörterbuchtyp,
scope='https://www.googleapis.com/auth/calendar',
redirect_uri=flask.url_for('oauth2callback', _external=True))
Sie können jetzt flow_from_clientsecrets
verwenden, das einen Wörterbuchtyp als Argument verwendet.
def new_func(args):
#Verschiedene Verarbeitung
return hoge
hoge_library.func = new_func
Auf diese Weise können Sie es leicht überschreiben und es wirkt sich auf alle Funktionen aus, die es verwenden.
Überschreiben von Bibliotheksfunktionen Ich habe es zum ersten Mal gemacht, aber es funktioniert so einfach. Ich habe Angst.
Recommended Posts