[GO] Überschreiben Sie Bibliotheksfunktionen in Python

Was Sie tun möchten, ist, wie der Titel sagt, so dass Sie die Einführung überspringen können.

Hintergrund, Einführung

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?)

Nachtrag

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.

Was du machen willst

Ich möchte ** Wörterbuchtyp ** anstelle von ** Dateiname ** in die Funktion oauth2client.client.flow_from_clientsecrets () einfügen.

Was ist passiert

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.

Zusammenfassung

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

Überschreiben Sie Bibliotheksfunktionen in Python
Python-Funktionen mit Chemoinfomatik gelernt
Python-Funktionen
[Python] Verwalten Sie Funktionen in einer Liste
Windows 10: Installieren der MeCab-Bibliothek für Python
Verwendung globaler Variablen in Python-Funktionen
Definieren Sie Funktionen (Methoden) in Python dynamisch
Python 3.6 E-Mail-Bibliothek
Quadtree in Python --2
Python in der Optimierung
CURL in Python
[Python, Julia] 3D-Anzeige in der Jupyter-Mayavi-Bibliothek
[Python3] Definieren Sie globale Variablen in einer Funktion dynamisch
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Verwenden Sie einfach Ihre eigenen Funktionen in Python
Ein Forscher eines Pharmaunternehmens fasste die Funktionen in Python zusammen
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
Programmieren mit Python
Was ist "Mahjong" in der Python-Bibliothek? ??
Plink in Python
Konstante in Python
Python Library Hinweis
Neue Funktionen in Python 3.4.0 (3) - Generische Funktionen für den Einzelversand
# Python-Grundlagen (Funktionen)
FizzBuzz in Python
SQLite in Python
[Anfänger] Python-Funktionen
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Python Einfach zu bedienende Funktionen
Quad-Tree in Python
Python-Grundlagen: Funktionen
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken