如何根据当前请求更改django设置?

如何根据当前请求更改django设置?,django,Django,我正在从一个django实例运行多个站点,并期望该框架最终能够从一个或多个安装中为数百个站点提供服务 我需要根据当前请求修补一些django设置。我已经编写了一些中间件来修补设置,但我需要在调用中间件之前修补这些设置,因为其他应用程序没有进行修补更改(即,应用程序运行,然后中间件运行,所以应用程序不使用修补设置) 我还应该补充一点,这主要是为了我还没有编写的第三方应用程序的好处,所以我不想到处添加装饰程序或类似的东西,因为那样会打乱我的升级路径 因此: 如何访问应用程序的init.py文件中的

我正在从一个django实例运行多个站点,并期望该框架最终能够从一个或多个安装中为数百个站点提供服务

我需要根据当前请求修补一些django设置。我已经编写了一些中间件来修补设置,但我需要在调用中间件之前修补这些设置,因为其他应用程序没有进行修补更改(即,应用程序运行,然后中间件运行,所以应用程序不使用修补设置)

我还应该补充一点,这主要是为了我还没有编写的第三方应用程序的好处,所以我不想到处添加装饰程序或类似的东西,因为那样会打乱我的升级路径

因此:

  • 如何访问应用程序的init.py文件中的当前请求
  • 应用程序的init.py会在每个请求中调用一次还是只调用一次?如果只有一次,我还可以怎样做才能在每个请求中操作一次设置
  • 做这种猴子修补术安全吗?我知道这会使代码更加不透明,但我不希望每个站点使用不同的wsgi文件,因为我希望允许用户编辑其中一些设置,并让我的猴子补丁来自数据库
  • 是否有更好的解决方案允许在数据库中存储某些设置

永远不要动态更改设置。您无法预测应用程序将来会如何部署,在大多数情况下,项目都会失败。。有趣的方法。

如果您真的想拥有数百个随时可以动态重新配置的站点,您可以尝试使用Djangos,它用于为框架的其余部分提供设置。您可以根据请求和它的主机字段对其进行修改。或者,您至少会遇到许多有趣的故障。

此模块-django tupperware满足您的要求:
试一试。

我解决这个问题的方法是给出每个请求、所有设置,并使用中间件动态更新它们,我如何做到这一点? 这相当简单: 这就是完成这一切的中间件

from django.conf import settings

class DumpObject: pass

class Settings(object):
    def process_request(self,request):
        request.settings = DumpObject()
        for setting in dir(settings):
            if not setting.startswith('__'):
                setattr(request.settings, setting, getattr(settings,setting))
DumpObject就在那里,所以我可以使用object.property符号,它可以是一个字典,但我想在语法上保持一些相似性。 这假设您的设置名称中没有以_u开头,这是一个合理的假设。 所以,如果我想覆盖一个特定的设置,我不保留设置文件,而是在这个中间件中进行。像这样:

class Settings(object):
    def process_request(self,request):
        request.settings = DumpObject()
        for setting in dir(settings):
            if not setting.startswith('__'):
                setattr(request.settings, setting, getattr(settings,setting))

         if 'mydomain' in str(request.host): #this is thanks to django-hosts project
            request.settings.GOOGLE_ANALYTICS_ID = '89298393-238'
当然,这并没有考虑到以旧方式访问设置的问题 从django.conf导入设置

settings.GOOGLE_ANALYTICS_ID = 'the value in settings.py'

但这真的不重要,因为您可能只想在请求对象可用的上下文中更改设置。

那么我有什么选择呢?我需要从数据库中获取设置,并在调用其他应用程序之前应用这些设置。不要这样做。不要尝试。将更多的计划放在架构中。好吧,应用程序的全部要点是用户可以创建自己的站点并在数据库中存储一些设置。。。你有什么建议吗?我也有同样的想法@Paul。我尝试重写一个database.py文件(该文件作为模块导入settings.py)。这种行为在生产中是不稳定的。4次中有2次会选择旧的数据库设置。解决方案:重新启动服务器-但如何在生产中重新启动(这是一个观点,不是一个答案,应该是一个评论!你为什么不从数据库生成WSGI文件?对我来说,这似乎是更明智的方法。有趣的是。但我在想,就可扩展性而言,如果整个应用程序是不可知站点的,那么我就可以提供一个新服务器,部署我的代码,每台服务器都只为pa服务当你说monkey patching时,你是在修改中间件中的
django.conf.settings