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
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.
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é.
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.
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.
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
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,
c'est tout.
Exemple de travail Repository here
Eh bien, bonne vie Django!
Recommended Posts