Сделать settings.py настраиваемым из пользовательского ввода? - PullRequest
0 голосов
/ 07 января 2010
def save_local_setting_JSON(dest, content):
        fwrite  = open(dest, 'wb')
        dict_json = eval(json.dumps(content))
        string_json =json.dumps(dict(dict_json))
        fwrite.write('EMAIL_DEVELOPMENT='+string_json+"\n")
        fwrite.close()

def config_mail_show(request, template='admin/config_mail.html'):
    form = forms.ConfigMailForm()# for for user input their mail config
    context = {
                'site_host' : settings.SITE_HOST,
                'default_from_email' : settings.DEFAULT_FROM_EMAIL,
                'email_host' : settings.EMAIL_HOST,
                'email_port' : settings.EMAIL_PORT,
                'email_host_user' : settings.EMAIL_HOST_USER,
                'email_host_password' : settings.EMAIL_HOST_PASSWORD,
                'email_use_tls' : settings.EMAIL_USE_TLS,
                'form':form
               }
    if request.method == "POST":
        form = forms.ConfigMailForm(request.method)
        save_local_setting_JSON('local_setting.py', request.POST)   
    return render_to_response(template, context)

local_setting.py будет в следующем формате:

EMAIL_DEVELOPMENT={"email_host_password": "xxxxxx", "site_host": "127.0.0.1:8000", "default_from_email": "xxx xxx <xxx@xxx.xxx>", "email_use_tls": "False", "email_port": "25","email_host_user": "xxx@xxx.xxx", "email_host": "smtp.xxx.xx"}

В settings.py я добавил

from local_setting import *
if EMAIL_DEVELOPMENT.has_key('save'):
    SITE_HOST = EMAIL_DEVELOPMENT['site_host']
    DEFAULT_FROM_EMAIL = EMAIL_DEVELOPMENT['default_from_email']
    EMAIL_HOST = EMAIL_DEVELOPMENT['email_host']
    EMAIL_PORT =EMAIL_DEVELOPMENT['email_port']
    EMAIL_HOST_USER = EMAIL_DEVELOPMENT['email_host_user']
    EMAIL_HOST_PASSWORD = EMAIL_DEVELOPMENT['email_host_password']
    EMAIL_USE_TLS = EMAIL_DEVELOPMENT['email_use_tls']
else:# My Development
    SITE_HOST = '127.0.0.1:8000'
    DEFAULT_FROM_EMAIL = 'xxxxx'
    EMAIL_HOST = 'xxxxx'
    EMAIL_PORT = 25
    EMAIL_HOST_USER ='xxxx'
    EMAIL_HOST_PASSWORD = 'xxxxx'
    EMAIL_USE_TLS = False

Я не уверен, что это хороший способ создать пользовательский интерфейс, обеспечивающий пользователя для его собственной конфигурации, такой как почта.

каждый здесь мог бы дать хороший выбор для этого?

Ответы [ 4 ]

3 голосов
/ 07 января 2010

Мне нравится django-dbsettings для работы с настраиваемыми настройками во время выполнения.

2 голосов
/ 07 января 2010

settings.py для настроек всего сайта. Если вы хотите, чтобы у каждого пользователя были свои настройки, создайте модель под названием user_settings (с FK для модели Users, конечно) и используйте ее для хранения настроек для каждого пользователя.

1 голос
/ 07 января 2010

Какой бы маршрут вы ни выбрали, он окажется хакерским - гарантирую.

Тем не менее, я думаю, что вы на правильном пути. Хранение настроек в базе данных кажется плохой идеей, потому что настройки соединения с базой данных находятся в самом файле settings.py, что может привести к серьезным проблемам.

Ваша идея использовать JSON и хранить данные в виде файла на диске, вероятно, является лучшим методом, потому что, как еще они будут храниться, если бы не база данных?

Моя единственная реакция на то, как вы пытались добиться этого, заключалась в том, что кажется, что было бы действительно нехорошо вручную кодировать все строки, подобные этой EMAIL_HOST = EMAIL_DEVELOPMENT['email_host']. Было бы проще просто проверить, существует ли это значение в локальных настройках JSON и вернуть его автоматически.

Вот немного хакерского и непроверенного концептуального кода. Скопируйте settings.py в settings_default.py, и он станет новым settings.py:

settings.py

from local_settings import EMAIL_DEVELOPMENT
import settings_default as defaults
import sys

class DynamicSettings(object):
    def __getattr__(self, key):
        if hasattr(EMAIL_DEVELOPMENT, key):
            return getattr(EMAIL_DEVELOPMENT, key.lower())
        else:
            return getattr(defaults, key)

sys.modules[__name__] = DynamicSettings()
0 голосов
/ 07 января 2010

Возможно, что-то вроде следующего будет работать:

class _DynamicMailSettings(object):
    @property
    def get_mail_host(self):
        result = 'smtp.mydomain.com' #replace with DB query
        return result
_dynamic_mail_settings = _DynamicMailSettings()

EMAIL_HOST = _dynamic_mail_settings.get_mail_host

Я не тестировал его в django settings.py, но он работает в отдельном файле python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...