RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 747839
Accepted
andreymal
andreymal
Asked:2020-11-22 04:17:25 +0000 UTC2020-11-22 04:17:25 +0000 UTC 2020-11-22 04:17:25 +0000 UTC

如何为 Django 项目进行多个配置(settings.py)?

  • 772

很明显,例如在生产和开发过程中,项目配置应该是不同的。但是,默认情况下,Django 提供了使用单个settings.py,它包含所有内容,没有任何分离的提示。我想分享。

例如,在开发过程中,可以启用DEBUG = True和连接生产中无法做到的Debug Toolbar,使用特定的本地开发者数据库,放宽限制等。

另外,如果你想在某个 github 上发布一个 Django 项目,那么将它添加到存储库settings.py中并使用所有密码一点也不酷。如果你从那里删除密码,提交并返回密码,那么这一切都非常不方便,你可能会不小心忘记它并settings.py使用密码提交。是的,会有冲突。

如何将配置划分为不同的部分,以便生产设置、开发设置和密码以某种方式彼此分开?

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    andreymal
    2020-11-22T04:17:25Z2020-11-22T04:17:25Z

    有几种不同的方法可以在互联网上分离 Django 配置,但我认为最好的方法是通过模块和DJANGO_SETTINGS_MODULE.

    启动 Django 从读取带有设置的 Python 模块开始,并且必须在环境变量中指定所需模块的名称DJANGO_SETTINGS_MODULE- 没有它,Django 根本无法启动。为了使开发人员的生活更轻松,该命令会django-admin startproject自动规定文件中DJANGO_SETTINGS_MODULE的视图值,以及. 因此,通过更改 value ,我们可以在不同的设置文件之间切换。yourproject.settingsmanage.pywsgi.pyasgi.pyDJANGO_SETTINGS_MODULE

    settings.py为了分离生产和开发,我建议使用settings包含子模块的目录而不是文件。结构是这样的:

    ├─ yourproject/
    │  ├─ settings/
    │  │  ├─ __init__.py
    │  │  ├─ base.py
    │  │  ├─ development.py
    │  │  └─ production.py
    │  ├─ __init__.py
    │  └─ asgi.py
    │  ├─ models.py
    │  ├─ urls.py
    │  └─ wsgi.py
    ├─ local_settings.py
    └─ manage.py
    

    该文件base.py存储所有环境通用的默认设置。development.py和文件production.py分别存储用于开发和生产的单独设置。根本没有文件settings.py。

    该文件的内容base.py与通常的类似settings.py- 您可以简单地重命名它。

    我们在文件development.py中写了一些简化开发和调试的东西:

    from .base import *  # подгружаем настройки по умолчанию
    
    DEBUG = True
    ALLOWED_HOSTS = ['*']
    INSTALLED_APPS = INSTALLED_APPS + ['debug_toolbar']
    MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware'] + MIDDLEWARE
    # и так далее
    

    在文件production.py中,我们编写了特定于“战斗”环境的设置:

    from .base import *
    
    DEBUG = False
    ALLOWED_HOSTS = ['yourproject.example.com']
    

    密码和密钥不存储在这里!更准确地说,您可以将base.py一些标准密钥写入 sqlite 数据库,但不应将它们视为秘密:其想法是所有这些文件都可以安全地发布而无需任何更改。

    现在如何选择合适的配置?首先,请记住它已经manage.py通过设置默认值写入文件中。现在你需要像这样替换它:

    # manage.py
    # ... найдите такую строку в файле и обновите её:
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "yourproject.settings.development")
    

    当您想选择其他配置时,应将环境变量替换为DJANGO_SETTINGS_MODULE. 我不会描述在不同操作系统中替换它的所有选项,但这里有一个示例 (*nix, sh):

    DJANGO_SETTINGS_MODULE=yourproject.settings.development ./manage.py runserver
    

    数据库连接、密码和密钥应存储在local_settings.py. 此文件是机密文件,不应添加到存储库中(对于 git,它需要在 中注册.gitignore)并且不应在任何地方发布。它可能看起来像这样:

    # Этим импортом вы можете выбирать между development и production
    from yourproject.settings.development import *
    
    DATABASES = { ... чтототам ... }
    SECRET_KEY = '230eoqd439wej9c0eru384jfsc'
    EMAIL_HOST_PASSWORD = '123456'
    # и все остальные секретики
    

    您可以通过相同的方式连接它DJANGO_SETTINGS_MODULE:

    DJANGO_SETTINGS_MODULE=local_settings ./manage.py runserver
    

    但是,一直设置环境变量似乎很不方便。您可以local_settings在文件中以相同的方式写入manage.py并和平相处。但是,您可能希望该文件local_settings.py对于项目的工作是可选的(如我所愿),因此您可以根据文件是否存在编写配置选项:

    # manage.py
    # ...
    if os.path.isfile(os.path.join(os.path.dirname(__file__), 'local_settings.py')):
        # Если рядом с manage.py лежит local_settings.py — используем его
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "local_settings")
    else:
        # Если нет — используем стандартные настройки без секретов
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "yourproject.settings.development")
    

    此外,值得记住的是,它DJANGO_SETTINGS_MODULE通常也写在文件中wsgi.py(并从 3.0 版本添加asgi.py),当您使用第三方服务器(uwsgi、gunicorn、uvicorn 等)在生产环境中运行项目时,您应该对这些文件进行类似的更改。

    (但是,在我的主观意见中,最好从外部删除引用DJANGO_SETTINGS_MODULE并wsgi.py始终asgi.py在外部设置环境变量 - 这将增加对项目的控制并防止意外启动不正确的设置。)

    • 6

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5