gpt4 book ai didi

Python fabric "local"函数不遵守环境变量 DJANGO_SETTINGS_MODULE

转载 作者:行者123 更新时间:2023-11-28 17:49:15 25 4
gpt4 key购买 nike

我的项目设置有以下方案:

myproject/
app1/
app2/
appN/
settings/
__init__.py
base.py
devel.py
production.py

在我的本地环境中,我有 virtualenvwrapper 的 postactivate 脚本:

myproject_root=/home/rantanplan/Projects/repos/myproject
cd $myproject_root
export DJANGO_SETTINGS_MODULE=myproject.settings.devel

这样当我执行 workon myproject 时,它将更改为项目的根目录并且设置我想要的事件 DJANGO_SETTINGS_MODULE

这对 django 和所有命令(如 python manage.py syncdb)都有效。

另一方面,现在我有这个结构任务:

@task
def syncdb():
local('python manage.py syncdb --noinput')

当我有一个简单的 settings.py 文件时,这曾经工作得很好,但是当我改变对于上面的方案,它引发了这个异常:

django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.

Fatal error: local() encountered an error (return code 1) while executing 'python manage.py syncdb --noinput'

Aborting.

一些补充说明:

  • > project函数在这里不适用,因为它错误地(在内部)假设所有 Django 设置模块都被命名为“设置”。
  • 我尝试了 settings_module功能无济于事。它在内部使用 os.environ 来设置环境变量,但没有任何效果。
  • 如果我在任务定义之前打印 os.environ['DJANGO_SETTINGS_MODULE'],它会正确打印“myproject.settings.devel”。

那么我在这里做错了什么,您建议我应该如何解决这个问题?


为了省去您的麻烦,我应该说我知道我可以通过以下方式解决这个问题:

def syncdb():
with prefix('export DJANGO_SETTINGS_MODULE=myproject.settings.devel'):
local('python manage.py syncdb --noinput')

但如果可以的话,我宁愿避免使用prefix

我也知道我可以做到,正如 hynekcer 所建议的那样:

@task
def syncdb():
local('python manage.py syncdb --settings=myproject.settings.devel --noinput')

但我真的很想知道为什么 local 不遵守 DJANGO_SETTINGS_MODULE 和为什么 settings_module 没有像宣传的那样工作。

最佳答案

您可以使用设置 选项。它优先于 DJANGO_SETTINGS_MODULE 变量。

@task
def syncdb():
local('python manage.py syncdb --settings=myproject.settings.devel --noinput')

关于Python fabric "local"函数不遵守环境变量 DJANGO_SETTINGS_MODULE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13333207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com