0 votes

Puis-je accéder à l'objet __dict__ pour la portée locale ?

Voici ma situation...

J'essaie de générer dynamiquement un tas de choses dans mon fichier settings.py sur un site django.

Je suis en train de mettre en place plusieurs sites, (via sites framework) et je voudrais avoir quelques valeurs que j'insère dans une fonction qui va générer une partie du fichier de paramètres pour chaque site.

par exemple :

from universal_settings import *

SITE_NAME = 'First Site'
SITE_SLUG = 'firstsite'

DEFAULT_FROM_EMAIL = '%s <noreply@otakupride.com>' % SITE_NAME
ROOT_URLCONF = 'mysite.urls.%s' % SITE_SLUG
TEMPLATE_DIRS += ( os.path.join(PROJECT_ROOT, "templates", SITE_SLUG), )

il est évident que c'est une énorme violation de DRY que d'avoir ces 3 dernières lignes dans le fichier de configuration pour chaque site utilisant ce code. Je veux donc faire quelque chose comme ceci

from universal_settings import *
from utils import get_dynamic_settings

SITE_NAME = 'First Site'
SITE_SLUG = 'firstsite'

get_dynamic_settings( locals() )

Et voici la fonction

# WARNING: THIS CODE DOES NOT WORK!
def get_dynamic_settings(context_dict):
    global DEFAULT_FROM_EMAIL
    global ROOT_URLCONF
    global TEMPLATE_DIRS

    DEFAULT_FROM_EMAIL = '%s <noreply@otakupride.com>' % context_dict['SITE_NAME']
    ROOT_URLCONF = 'mysite.urls.%s' % context_dict['SITE_SLUG']
    TEMPLATE_DIRS += ( os.path.join(PROJECT_ROOT, "templates", context_dict['SITE_SLUG']), )

Ma question est donc la suivante : comment puis-je ajouter des éléments au champ d'application du fichier de configuration ? dictée disponible pour les variables qu'il contient.

Peut-être que je m'y prends mal ? Merci de votre aide !

PS - ma compréhension de la global est qu'il indique au compilateur que la fonction a pour but de manipuler une variable globale dans son propre fichier - Existe-t-il une telle chose pour le fichier dans lequel la fonction est appelée ?

3voto

Cat Plus Plus Points 53385

Dict renvoyé par locals() (ou globals() ) est mutable, ce qui permet de faire :

def get_dynamic_settings(context_dict):
    context_dict['DEFAULT_FROM_EMAIL'] = '%s <noreply@otakupride.com>' % context_dict['SITE_NAME']
    context_dict['ROOT_URLCONF'] = 'mysite.urls.%s' % context_dict['SITE_SLUG']
    context_dict['TEMPLATE_DIRS'] += (os.path.join(PROJECT_ROOT, "templates", context_dict['SITE_SLUG']),)

3voto

Ned Batchelder Points 128913

Vous voudrez peut-être vous pencher sur les différents schémas utilisés pour configurer de nombreux sites django sans duplication : http://stackoverflow.com/questions/1626326/how-to-manage-local-vs-production-settings-in-django y http://stackoverflow.com/questions/1406892/elegantly-handle-site-specific-settings-configuration-in-svn-hg-git-etc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X