如何在Django的不同设置上正确运行服务器?

时间:2018-03-12 12:39:59

标签: python django

我有一个基本的django rest API。我想将dev和prod的一些设置分开,仅用于组织目的。我也正在学习分离环境。我已经阅读了一些内容,但我似乎无法按照我想要的方式工作。

层次结构如下所示:

- djangorest
  - api
    - __init__.py
    - models.py
    - views.py
    - urls.py
    - etc..
  - djangorest
    - __init__.py
    - settings.py
    - urls.py
    - wsgi.py

现在,当我运行服务器时,我做了一个简单的事情:

python3 manage.py runserver

该命令从settings.py中读取设置并正确运行它但我已经查看了如何将设置分成prod vs dev并且它无法正常工作。

我希望能够拥有:

commonsettings.py
dev.py
prod.py

在共同设定中,它只会包含dev和prod中的任何内容。我试过跑:

python3 manage.py runserver --settings=settings.dev

但它给我一个错误,说没有名为'setting'的模块。

请帮忙。谢谢!

7 个答案:

答案 0 :(得分:3)

创建名为config

的文件夹
config/
    commonsettings.py
    dev.py
    prod.py

请确保在dev.py和prod.py中导入commonsettings.py中的所有内容,如下所示:

from .commonsettings import * 

然后如果你想运行dev.py设置:

python manage.py runserver --settings=config.dev

如果你想运行prod.py:

python manage.py runserver --settings=config.prod

注:

对于更易读的文件,许多开发人员调用他们的设置文件:local.py(用于本地设置)production.py(用于生产设置)和base.py(两者的通用设置)

我个人将设置文件放在:

config/
    settings/
        base.py
        local.py
        production.py
        test.py (For tests)

答案 1 :(得分:0)

将所有常用配置放在公共设置 py 文件中。

将该行添加到设置目录中的 __ init __。py 文件

from commonsettings import *

这使得 commonsettings 文件中的所有配置都可在设置文件夹中的所有其他文件中使用

使用

启动服务器
python3 manage.py runserver --settings=djangorest.settings.dev

答案 2 :(得分:0)

将dev.py上的settings.py替换为dev服务器上的dev.py和生产服务器上的prod.py。

现在在init.py文件中编写代码

try:
    print("Trying import production.py settings...")
    from .prod import *
except ImportError:
    print("Trying import development.py settings...")
    from .dev import *

它在生产服务器中找到prod.py并导入它。在开发服务器上它找不到和prod.py并导入dev.py

然后您不需要在运行runserver命令时指定配置文件名。

答案 3 :(得分:0)

此解决方案无需额外参数即可运行,无需跨环境替换/删除文件。

make settings.py决定加载哪个文件

让我们假设您的Django项目名为MyDjangoApp。

在Django项目的根目录中创建config/目录,在每个环境中创建一个.py目录,例如:像这样:

config/
  local.py
  dev.py
  prod.py
MyDjangoApp/
  settings.py

环境数量没有逻辑限制,我只添加了我通常拥有的三种环境。

然后,在MyDjangoApp/settings.py内,我们可以添加逻辑来选择要加载的设置文件。

"""
Django settings for MyDjangoApp project.
"""

import os

# Begin: Custom per-env settings
import socket
# Use the appropriate logic to understand "where" we're running
HOST = socket.gethostname() 
configs = {
    'localhost': 'local', # replace 'localhost' with whatever your machine name is
    'dev.mysite.com': 'dev',
    'www.mysite.com': 'production',
}

config = 'config.{}'.format(configs[HOST])

settings_module = __import__(config, globals(), locals(), ['MyDjangoApp', ])

try:
    for setting in dir(settings_module):
        # Only fully-uppercase variables are supposed to be settings
        if setting == setting.upper():
            locals()[setting] = getattr(settings_module, setting)
except Exception:
    # you may ignore this exception, the print() is for debugging purposes 
    print(Exception)

# End: Custom per-env settings

# ... the rest of the common settings go here

请注意:此逻辑根据运行Django应用程序的服务器的主机名选择要加载的设置文件。这只是一个例子 - 您可以实现适合您的任何其他逻辑。

仅更改所需内容

好消息是,settings.py仍可以保留绝大多数设置,config/中的文件只需要包含在您的环境中更改的设置,例如:

  • 数据库
  • DEBUG
  • ADMINS
  • 测井

避免 - 在命令行中设置

您可以将Django设置设置为shell环境变量,如下所示:

export DJANGO_SETTINGS_MODULE=MyDjangoApp.settings

执行此操作的最佳位置是.sh文件;通常我会在Django项目的根目录中创建一个名为env.sh的文件,并在激活virtualenv之后运行它(一次)。

文件/env.sh内容

#!/usr/bin/env bash

export DJANGO_SETTINGS_MODULE=MyDjangoApp.settings

从终端运行它(Bash,或Windows上的git-scm Bash):

. env.sh 

然后,无论您身在何处,都可以使用./manage.py runserver启动Django服务器。

参考:https://code.djangoproject.com/wiki/SplitSettings#DevelopmentMachineDependantSettingsConfiguration

答案 4 :(得分:0)

我一直在做的是在本地env上创建一个名为local_settings.py的文件,该文件可以拥有自己的数据库设置,静态路径等,并在设置文件的末尾包括这个

try:
    from local_settings import *#
except:
    pass

所以在服务器上我总是确保不要导入local_settings并且很好地将它们分开。

答案 5 :(得分:0)

  

项目层次结构将

- djangorest
  - api
    - __init__.py
    - models.py
    - views.py
    - urls.py
    - etc..
  - djangorest
    - settings           (folder)
    - commonsettings.py
    - dev.py
    - prod.py
    - __init__.py
    - settings.py
    - urls.py
    - wsgi.py

python manage.py runserver

之前运行此命令之后
  

export PYTHONPATH = $ PWD

     

export DJANGO_SETTINGS_MODULE = djangorest.settings.dev

     

最后 python manage.py runserver

答案 6 :(得分:0)

例如,我在开发人员设置中打开SQL日志

  1. 我的文件结构:
    创建设置文件夹并将mv原始settings.py设置为settings / defaults.py enter image description here

  2. init .py

  3. 中加载默认设置
# proj/proj/settings/__init__.py

from .defaults import *
  1. 编辑dev.py
# proj/proj/settings/dev.py

from .defaults import *
DEBUG = True

# print sql to the console
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level': 'DEBUG',
        }
    },
}

  1. 在python env中运行
./manage.py runserver --settings proj.settings.dev

enter image description here

Django 2.1.7 | Mac