Remplacer les fonctions de bibliothèque en Python

Vous pouvez sauter l'introduction car ce que vous voulez faire est comme le titre l'indique.

Contexte, introduction

J'écrivais une application pour jouer avec Google Agenda à l'aide de la bibliothèque cliente des API Google. Supprimez les informations du client OAuth2 de Google Cloud Platform en tant que client_secret.json et spécifiez le ** nom de fichier ** dans l'argument de ʻoauth2client.client.flow_from_clientsecrets ()`.

Le problème ici. Je ne veux pas ajouter client_secret.json au contrôle de version git en raison de problèmes de sécurité. Cependant, j'exécute l'application sur Heroku, je ne peux donc pas télécharger de fichiers. (Il semble que vous devriez utiliser le stockage d'objets comme Amazon S3, mais j'ai arrêté parce que c'est ennuyeux parce que je ne l'ai jamais utilisé)

J'ai donc dû spécifier client_secret.json, mais j'avais du mal à mettre ce fichier sur le serveur Heroku.

Donc, je veux mettre les données du dictionnaire au lieu de file name dans la fonction ʻoauth2client.client.flow_from_clientsecrets (). Ensuite, stockez le contenu de client_secret.json` dans les variables d'environnement de Heroku et placez-les dans les données du dictionnaire. (Est-ce vraiment mal de mettre des informations confidentielles dans des variables d'environnement?)

Postscript

Après avoir écrit le code, j'ai réalisé que j'aurais dû créer une instance de ʻOAuth2WebServerFlow` normalement. Par conséquent, je n'ai pas à le remplacer séparément, mais j'ai appris que cela peut être fait de cette manière, alors je vais le laisser.

Chose que tu veux faire

ʻOauth2client.client.flow_from_clientsecrets () `Je veux que la fonction contienne ** type de dictionnaire ** au lieu de ** nom de fichier **.

Qu'est-il arrivé

Le code source de la bibliothèque ressemblait à ceci. (Ce qui suit est un extrait du code de licence Apache de Google Inc.)

Partiellement omis de ʻ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,
        -----Ce qui suit est omis------

Notez que filename est passé à clientsecrets.loadfile (). J'ai aussi regardé clientsecrets.loadfile ().

def loadfile(filename, cache=None):
    _SECRET_NAMESPACE = 'oauth2client:secrets#ns'

    if not cache:
        return _loadfile(filename)

    obj = cache.get(filename, namespace=_SECRET_NAMESPACE)
    -----Ce qui suit est omis------

Si cache n'existe pas, le traitement est transféré à la fonction _loadfile. Jetons un œil à _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)

Je suis arrivé à la fonction qui charge le fichier. Si vous remplacez cette fonction, vous pouvez mettre un type de dictionnaire dans l'argument filename.

Alors après ça mon code

# `client.flow_from_clientsecrets`Les fonctions peuvent prendre le type de dictionnaire comme arguments
# `clientsecrets._loadfile`Fonction de remplacement
def new_loadfile(data):
    return clientsecrets._validate_clientsecrets(data)
clientsecrets._loadfile = new_loadfile

Après ça

flow = client.flow_from_clientsecrets(
Sorte de dictionnaire,
    scope='https://www.googleapis.com/auth/calendar',
    redirect_uri=flask.url_for('oauth2callback', _external=True))

Vous pouvez maintenant utiliser flow_from_clientsecrets qui prend un type de dictionnaire comme argument.

Résumé

def new_func(args):
    #Traitement divers
    return hoge
hoge_library.func = new_func

De cette façon, vous pouvez facilement le remplacer et cela affectera toutes les fonctions qui l'utilisent.

Remplacer les fonctions de la bibliothèque, je l'ai fait pour la première fois, mais cela fonctionne si facilement. J'ai peur.

Recommended Posts

Remplacer les fonctions de bibliothèque en Python
Fonctions Python apprises avec la chimioinfomatique
Fonctions Python
[python] Gérer les fonctions dans une liste
Windows10: Installation de la bibliothèque MeCab pour python
Utilisation de variables globales dans les fonctions python
Définir dynamiquement des fonctions (méthodes) en Python
Bibliothèque de messagerie Python 3.6
Quadtree en Python --2
Python en optimisation
CURL en Python
[Python, Julia] Affichage 3D dans la bibliothèque Jupyter-Mayavi
[Python3] Définir dynamiquement des variables globales dans une fonction
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Utilisez facilement vos propres fonctions en Python
Un chercheur d'une société pharmaceutique a résumé les fonctions de Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
Programmation avec Python
Qu'est-ce que "mahjong" dans la bibliothèque Python? ??
Plink en Python
Constante en Python
Note sur la bibliothèque Python
Nouvelles fonctionnalités de Python 3.4.0 (3) - Fonctions génériques à distribution unique
# Bases de Python (fonctions)
FizzBuzz en Python
Sqlite en Python
[Débutant] Fonctions Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Fonctions Python faciles à utiliser
Quad-tree en Python
bases de python: fonctions
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python