[PYTHON] Django: Implementieren Sie wiederverwendbare APP-Einstellungen nach Django RestFrameWork

Django: Implementieren Sie wiederverwendbare APP-Einstellungen nach Django RestFrameWork

Wenn ich mit der Entwicklung mit Django beginne, eine wiederverwendbare APP erstelle und in einem anderen Projekt installiere, kann ich die in der APP festgelegten Standardeinstellungen nicht ändern ... Also suchte ich nach einer Möglichkeit, die Einstellungen für jede Anwendung von ** project / settings.py ** zu ändern. Es gab guten Code in ** Django Rest Framework **, also habe ich es als Referenz versucht.

Nehmen wir als Beispiel eine einfache ** Todo Task Api **.

Arbeitsprobe Repository hier

Beispiel mit 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
}

...

Ich habe es so geändert. Jetzt können Sie PAGE_SIZE ändern, wenn Sie Paginierung verwenden.

Beispiel in Todo Task Api

Schauen wir uns ein Beispiel an, wie es mit einer wirklich einfachen Todo Task-API funktioniert.

** Modell ** ist nur die folgende Aufgabe.

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 ** ist die Instanz, in der Sie die APP-Einstellungen sehen können. Sie können den Wert mit ** api_settings.KEY ** erhalten. In diesem Beispiel können die folgenden beiden in settings.py geändert werden.

Angenommen, der Standardeinstellungswert von ** TASK_STATUS_CHOICES ** wird in todo_api / settings.py wie folgt festgelegt.

todo_api/settings.py



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

...

Wenn Sie dies ändern möchten, können Sie es ändern, indem Sie project / settings.py ändern.

project/settings.py



...

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

Sie können den Aufgabenstatusoptionen ** NEW_STATUS ** hinzufügen, indem Sie den obigen Code hinzufügen. Schauen wir uns den detaillierten Code an.

APISettings Klasse

Ich habe die Klasse ** APISettings ** sehr vereinfacht, indem ich mich auf ** Django Rest Framework ** bezog.

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]

Es ist wichtig, die Methode getattr zu verwenden. Auf diese Weise können Sie mit api_settings.KEY auf die Einstellungen zugreifen. ** self._user_settings ** wird der Wert unter ** settings_root_name ** zugewiesen, der in project / settings.py festgelegt ist.

APP-Seite settings.py

Verwenden wir nun die zuvor erstellten ** API-Einstellungen **, um ** eine Einstellungsinstanz für die TODO-APP ** zu erstellen.

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)

Generieren Sie, indem Sie ** den Stammnamen der Einstellung ** als erstes Argument von APISettings und ** den Standardeinstellungswert ** als zweites Argument übergeben.

Damit sind die Einstellungen abgeschlossen.

verwenden

Um die zuvor erstellten Einstellungen für TODO_API zu verwenden, importieren Sie einfach und greifen Sie darauf zu.

todo_api/models.py



from .settings import api_settings

print(api_settings.TASK_TITLE_MAX_LENGTH)
# > 30

Zusammenfassung

Jetzt können Sie die Einstellungen der gepackten APP unter settings.py auf der Projektseite ändern. Als Fluss,

  1. Kopieren Sie die APISettings-Klasse
  2. Legen Sie den Stammnamen für die APP-Einstellungen fest
  3. Definieren Sie Standard in settings.py auf der APP-Seite
  4. Erstellen Sie eine Instanz von APISettings in settings.py auf der APP-Seite
  5. Verwenden

das ist alles.

Arbeitsprobe Repository hier

Na dann, ein gutes Django-Leben!

Recommended Posts

Django: Implementieren Sie wiederverwendbare APP-Einstellungen nach Django RestFrameWork
Implementieren Sie die Django-App auf Hy
Grundeinstellung von Django
Django + MySQL-Einstellungen
Django URL-Einstellungen
Starten Sie meine Django-App
Initialisieren Sie die Django-App
Einstellungen für die Vervollständigung des Django-Befehls