我有一个基本的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'的模块。
请帮忙。谢谢!
答案 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)
此解决方案无需额外参数即可运行,无需跨环境替换/删除文件。
让我们假设您的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/
中的文件只需要包含在您的环境中更改的设置,例如:
您可以将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日志
# proj/proj/settings/__init__.py
from .defaults import *
# 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',
}
},
}
./manage.py runserver --settings proj.settings.dev
Django 2.1.7 | Mac