[PYTHON] Django: implémenter les paramètres d'application réutilisables suivant Django RestFrameWork

Django: implémenter les paramètres d'application réutilisables suivant Django RestFrameWork

Lorsque je commence à développer avec Django, que je crée une application réutilisable et que je l'installe dans un autre projet, je ne peux pas modifier les paramètres par défaut définis dans l'application ... Je cherchais donc un moyen de modifier les paramètres de chaque application à partir de ** project / settings.py **. Il y avait du bon code dans ** Django Rest Framework **, donc je l'ai essayé comme référence.

Prenons un simple ** Todo Task Api ** comme exemple.

Exemple de travail Repository here

Exemple avec Django Rest Framework

project/settings.py



...

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 10
}

...

Je l'ai changé comme ça. Vous pouvez maintenant changer PAGE_SIZE lors de l'utilisation de la pagination.

Exemple dans Todo Task Api

Jetons un coup d'œil à un exemple de son fonctionnement avec une API Todo Task très simple.

** Modèle ** est uniquement la tâche suivante.

todo_api/models.py



from django.db import models
from .settings import api_settings


class Task(models.Model):
    title = models.CharField(max_length=api_settings.TASK_TITLE_MAX_LENGTH)
    status = models.IntegerField(choices=api_settings.TASK_STATUS_CHOICES)
    

** todo_api.settings.api_settings ** est l'instance où vous pouvez voir les paramètres de l'application. Vous pouvez obtenir la valeur avec ** api_settings.KEY **. Dans cet exemple, les deux suivants peuvent être modifiés dans settings.py.

Par exemple, supposons que la valeur de paramètre par défaut de ** TASK_STATUS_CHOICES ** est définie comme suit dans todo_api / settings.py.

todo_api/settings.py



DEFAULTS = {
    'TASK_TITLE_MAX_LENGTH': 30,
    'TASK_STATUS_CHOICES': [
        (1, 'TODO'),
        (2, 'DOING'),
        (3, 'DONE'),
    ]
}

...

Si vous souhaitez modifier cela, vous pouvez le modifier en modifiant project / settings.py.

project/settings.py



...

TODO_API = {
    'TASK_STATUS_CHOICES': [
        (1, 'TODO'),
        (2, 'DOING'),
        (3, 'DONE'),
        (4, 'NEW_STATUS'),
    ],
}

Vous pouvez ajouter ** NEW_STATUS ** aux choix d'état de la tâche en ajoutant le code ci-dessus. Regardons en fait le code détaillé.

Classe APISettings

J'ai rendu la classe ** APISettings ** très simplifiée en faisant référence à ** Django Rest Framework **.

utils/api_settings.py



from django.conf import settings


class APISettings:
    """
    A settings object, that allows API settings to be accessed as properties.

    Set default settings in your app settings.py like this:
        from app_utils.setting import APISettings
        api_settings = APISettings('TODO_API', DEFAULTS)

    For example:

        from todo_api.settings import api_settings
        print(api_settings.TASK_STATUS_CHOICES)

    """

    def __init__(self, setting_root_name, defaults):
        self._setting_root_name = setting_root_name
        self._defaults = defaults
        self._user_settings = getattr(settings, self._setting_root_name, {})

    def __getattr__(self, item):
        if item not in self._defaults:
            raise AttributeError("Invalid {} setting: {}".format(self._setting_root_name, item))

        try:
            return self._user_settings[item]
        except KeyError:
            return self._defaults[item]

Il est important d'utiliser la méthode getattr. Cela vous permet d'accéder aux paramètres avec api_settings.KEY. ** self._user_settings ** reçoit la valeur ci-dessous ** setting_root_name ** définie dans project / settings.py.

Settings.py côté APP

Utilisons maintenant les ** Paramètres d'API ** que nous avons créés précédemment pour ** créer une instance de paramètres pour TODO APP **.

todo_api/settings.py



from utils.app_setting import APISettings

DEFAULTS = {
    'TASK_TITLE_MAX_LENGTH': 30,
    'TASK_STATUS_CHOICES': [
        (1, 'TODO'),
        (2, 'DOING'),
        (3, 'DONE'),
    ],
}

api_settings = APISettings('TODO_API', DEFAULTS)

Générez en transmettant ** le nom racine du paramètre ** comme premier argument de APISettings et ** la valeur de paramètre par défaut ** comme deuxième argument.

Ceci termine les réglages.

utilisation

Pour utiliser les paramètres de TODO_API créés précédemment, il vous suffit d'importer et d'accéder.

todo_api/models.py



from .settings import api_settings

print(api_settings.TASK_TITLE_MAX_LENGTH)
# > 30

Résumé

Vous pouvez maintenant modifier les paramètres de l'application packagée à partir de settings.py du côté du projet. En tant que flux,

  1. Copiez la classe APISettings
  2. Décidez du nom racine des paramètres de l'application
  3. Définissez Default dans settings.py du côté APP
  4. Créez une instance de APISettings dans settings.py du côté APP
  5. Utilisez

c'est tout.

Exemple de travail Repository here

Eh bien, bonne vie Django!

Recommended Posts

Django: implémenter les paramètres d'application réutilisables suivant Django RestFrameWork
Implémenter l'application Django sur Hy
Configuration initiale de django
Paramètres Django + MySQL
Paramètres d'URL de Django
Lancer mon application Django
Initialiser l'application Django
Paramètres d'achèvement de la commande Django