【问题标题】:environment settings in my django app are set to debug false but in production it acts as if its true我的 django 应用程序中的环境设置设置为 debug false 但在生产中它的行为就像它的 true
【发布时间】:2016-09-24 20:59:14
【问题描述】:

我的 django 应用程序有本地和生产设置,可以像这样从基础导入

from .base import *

try:
    from .local import *
except:
    pass

try:
    from .production import *
except:
    pass

在我的基地里,我有

import os
import dj_database_url
from .my_pass import SECRET, EMAIL_PASSWORD, EMAIL_USER

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))



SECRET_KEY = SECRET

DEBUG = False

在我的本地

import os
import dj_database_url
from .my_pass import SECRET

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))


SECRET_KEY = SECRET

DEBUG = True

在我的作品中

from django.conf import settings

if not settings.DEBUG:
    import os
    import dj_database_url


    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
    PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))




    SECRET_KEY = os.environ['SECRET_KEY']

    DEBUG = False

但是当我通过这样做在生产中测试它时

example.com/jnxejnn

它向我显示了一个 url 列表,好像 DEBUG 设置为 true。这是为什么呢?

【问题讨论】:

    标签: python django development-environment production-environment


    【解决方案1】:

    查看设置文件的顺序:

    • 首先从 base 导入:DEBUG 为 False
    • 然后从本地导入:DEBUG 为 True
    • 然后它从生产中导入:此时,DEBUG 为 True,因此您的 if not settings.DEBUG: 块永远不会进入,并且 DEBUG 不会再次设置为 False。

    因此,DEBUG 保持为 True,因为它是在本地设置文件中设置的。

    我不确定您的if not settings.DEBUG 检查的目的是什么,但我认为如果您消除该条件,它将按您的预期工作。

    [编辑] 尽管上面确实回答了您“为什么会这样?”的问题,但它并不能真正满足您的需求,因此我建议您对设置文件进行如下修改:

    from .base import *
    
    if os.environ['DJANGO_SERVER_TYPE'] == 'local':
        try:
            from .local import *
        except:
            pass
    
    if os.environ['DJANGO_SERVER_TYPE'] == 'production':
        try:
            from .production import *
        except:
            pass
    

    【讨论】:

    • 如果我删除该块,那么我的本地开发将无法正常运行并且我无法调试。我正在关注一个教程。我什至这样做的目的是,每次我 git push heroku master 时我都不必手动更改默认 true/false
    • 我不确定您正在学习什么教程,但您的学习方式必然会导致这种情况。通常,您将使用环境变量来确定要加载的设置文件。请参阅我的答案的编辑以了解我的意思。然后,为了指示应该使用哪个设置文件,只需适当地设置DJANGO_SERVER_TYPE 环境变量。
    • 并删除 production.py 中的 if settings.debug ?
    • 对,因为我们已经将条件放在了设置文件本身中,您不再需要production.py中的条件
    • 它仍在从生产中获取信息。如果我将生产注释掉,那么它将获得其他设置
    【解决方案2】:

    最终这对我有用

    from .base import *
    
    if os.getenv('_system_name') == 'OSX':
        from .local import *
    
    else:
        from .production import *
    

    我不明白为什么教程让这变得如此复杂。我运行 printenv 来查看我正在创建的变量,并尝试了解它们为什么不起作用。我注意到了

    _system_name=OSX
    

    并认为我可以使用它,因为希望 heroku 的服务器名称不同

    同时在我的一个 chrome 标签中(我打开了多个标签来寻找答案)我看了一篇关于如何使用环境变量的帖子,因为这个

    os.environ['DJANGO_SERVER_TYPE'] == 'production'
    

    一直给我这个错误

    File "/Users/ray/Desktop/myheroku/practice/src/gettingstarted/settings/__init__.py", line 3, in <module>
    if os.environ['DJANGO_SERVER_TYPE'] == 'local':
    File "/Users/ray/Desktop/myheroku/practice/bin/../lib/python3.5/os.py", line 683, in __getitem__
    raise KeyError(key) from None
    KeyError: 'DJANGO_SERVER_TYPE'
    

    所以我看到有人用这个

    os.getenv('TAG') 
    

    我想我可以这样使用它

    os.getenv('_system_name') == 'OSX'
    

    现在我的本地作品按预期工作,我的生产按预期工作。我目前正试图让它工作

    from .base import *
    try:
        from .local import *
    except:
        pass
    
    try:
        from .production import *
    except:
        pass
    

    在过去的 3 天里,我一直在寻求建议并一直在努力工作。如果我的解决方案不合适,请告诉我为什么不合适。但截至目前它正在工作

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 2013-04-19
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 2021-04-04
      • 2012-08-13
      相关资源
      最近更新 更多