代码之家  ›  专栏  ›  技术社区  ›  tree em

从用户输入中定制settings.py?

  •  0
  • tree em  · 技术社区  · 15 年前
    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 回复  |  直到 15 年前
        1
  •  2
  •   James Polley    15 年前

    settings.py用于站点范围的设置。如果希望每个用户都有自己的设置,请创建一个名为“用户设置”的模型(当然对用户模型使用FK),并使用该模型存储每个用户的设置。

        2
  •  3
  •   Daniel Roseman    15 年前

    我喜欢 django-dbsettings 用于处理可配置为运行时的设置。

        3
  •  1
  •   T. Stone    15 年前

    不管你走哪条路,结果都会很糟糕——我保证。

    也就是说,我觉得你走对了。在数据库中存储设置似乎是一个坏主意,因为数据库连接设置是在settings.py文件本身中找到的,这可能会导致一些非常严重的问题。

    您使用JSON并将数据存储为磁盘文件的想法可能是最好的方法,因为如果不在数据库中,它将如何存储?

    我对你试图达到这个目的的唯一反应是,像这样手工编写所有的代码似乎是很不明智的。 EMAIL_HOST = EMAIL_DEVELOPMENT['email_host'] . 只需检查本地设置JSON中是否存在该值并自动返回该值,就会更容易。

    这里有一些黑客和未经测试的概念代码。将settings.py复制到settings_default.py,这将成为新的settings.py:

    设置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()
    
        4
  •  0
  •   Gattster    15 年前

    也许像下面这样的方法是可行的:

    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文件中工作。