你如何在 Django 中为每个应用程序设置不同的设置?

Posted

技术标签:

【中文标题】你如何在 Django 中为每个应用程序设置不同的设置?【英文标题】:How do you have different settings per app in Django? 【发布时间】:2016-06-18 21:57:19 【问题描述】:

如何在 Django 中为每个应用设置不同的设置?例如,我有 2 个应用程序:

internal_api external_api

他们需要对 JWT 令牌的过期增量进行不同的设置。我正在使用一个名为 djangorestframework-jwt 的 django-rest-framework 插件

internal_api 需要设置:

JWT_AUTH = 
    'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=12),

external_api 需要设置:

JWT_AUTH = 
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),

【问题讨论】:

为什么不在同一个设置文件中创建两个不同的设置,一个叫做 JWT_AUTH_EXT,另一个叫做 JWT_AUTH_INT(或类似的东西)? 因为当djangorestframework-jwt 初始化设置时,它只寻找添加名为JWT_AUTH 的设置,其他任何内容都不会导入设置。 github.com/GetBlimp/django-rest-framework-jwt/blob/master/… 第 53 行显示了这些设置存储为 api_settings 的位置。那些api_settings 是库的其余部分引用的设置... 【参考方案1】:

您可以在运行时在您需要的特定应用程序中以特定于模块的方式import Django 设置。你这样做:

from django.conf import settings
from internal_api import internal_api_settings
settings.configure(default_settings=internal_api_settings)

其中internal_api_settings 将是internal_api 中指定JWT_AUTH 值的模块。我相信您可以在settings.configure() 电话中更加具体并实际指定:

settings.configure(JWT_AUTH=internal_api_settings.settings_dictionary)

settings_dictionary 是您要传递到设置中的值。

【讨论】:

我尝试了上述方法,但得到了RuntimeError: Settings already configured. 另外,Django 文档说不要这样做...docs.djangoproject.com/en/1.9/topics/settings/… 另见:docs.djangoproject.com/en/1.9/topics/settings/… 我相信如果你在你的应用目录中使用 settings.py 是可以的。他们大多只是不希望你这样做。 settings.configure 只能运行一次。即使在settings.py 文件中也无法运行。在这样做时,它还会重写应用程序其余部分的设置。

以上是关于你如何在 Django 中为每个应用程序设置不同的设置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中为 celery beat 设置不同的工作日/周末时间表?

如何在(Django GeoIP)中为每个国家/地区显示广告

如何在django中为问题添加多个表单字段类型的选项?

如何在 Django 中为 WhiteNoise 5.1.0 设置 wsgi.py 文件?

django + celery - 如何在我的 django 应用程序中为 celery 设置 crontab 计划?

如何在序列化程序 django rest 框架中为外键设置源