【问题标题】:django production environment is using the wrong dbdjango 生产环境使用了错误的数据库
【发布时间】:2015-01-27 12:20:01
【问题描述】:

我正在编写我的第一个“自制部署”。使用结构编写部署脚本。我在我的生产机器上添加了一个导出到 .bashrc 以导出一个 key:value {'DIGITAL_OCEAN': True},这样我就可以在我的设置中添加一些条件来使用基于本地或生产环境的数据库。

SETTINGS.PY

import os
if 'DIGITAL_OCEAN' in os.environ:
        ON_DO = True
else:
        ON_DO = False

if ON_DO:
        DATABASES = {
        'default': {
                'ENGINE': 'django.db.backends.postgresql_psycopg2',
                'NAME': 'user',
                'USER': 'user',
                'PASSWORD': 'pass',
                'HOST': 'localhost',
                'PORT': '',
                }
        }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'localuser',
            'USER': 'localuser',
            'PASSWORD': 'localpass',
            'HOST': 'localhost',
            'PORT': '',
            }

现在...如果我运行像“$ python manage.py migrate”这样的 ssh 命令一切顺利 ON_DO 被发现并且一切顺利,但在我的部署脚本中,如下所列,ON_DO 是假的,我有这之前是自发发生的,然后它自行纠正(可能是通过 gunicorn 或 nginx 重新启动),所以我尝试在脚本中添加一些重新启动,但到目前为止没有运气,而且我没有想法。

def server():

        '''IDK'''
        env.host_string = 'ip.ip.ip.ip'
        env.user = 'root'

def pull_deploy():

        '''Makes the server pull it from git repo at bitbucket'''

        path = '/home/django/'


        print(red('BEGINNING PULL DEPLOY'))

        with cd('%s' % path) :
                run('pwd')
                print(green('Pulling Master from Bitbucket'))
                run('git pull origin master')

                print(green('SKIPPING installing requirements'))
                run('source %spyenv/bin/activate && pip install -r langalang/requirements.txt' % path)

                print('Collecting static files')
                run('source %spyenv/bin/activate && python langalang/manage.py collectstatic' % path)

                print('Restarting Gunicorn')
                run('sudo service gunicorn restart')
                print('Restarting Nginx')
                run('nginx -s reload')

                print('Making migrations')
                run('source %spyenv/bin/activate && python langalang/manage.py makemigrations' % path)

                print('Migrating DB')
                run('source %spyenv/bin/activate && python langalang/manage.py migrate' % path)

                print('Restarting Gunicorn')
                run('sudo service gunicorn restart')
                print('Restarting Nginx')
                run('nginx -s reload')
                print(red('DONE'))

【问题讨论】:

    标签: django deployment digital-ocean


    【解决方案1】:

    问题是我在 ~.bashrc 或 ~.profile 中声明了我的环境变量“ON_DO”,而那些只从登录 shell 导出变量。我猜 django 在它自己运行时不算作登录 shell。我不得不从 django 本身的 .wsgi 文件中导出它们。

    据我所知,该文件仅在生产中运行,因此它仅将变量输出到生产系统。

    【讨论】:

      【解决方案2】:

      @deltaskelta 为什么要在wsgi.py 文件中设置变量?因为这个变量也将在您的开发环境中设置,它不会破坏目的吗?

      这是我编写的 shell 脚本。

      #!/bin/sh
      
      ps aux | grep usr/bin/[p]ython
      
      if [ $? != 0 ]
      then
          export UNIQUE_KEY='value'
          python ~/project_name/manage.py runserver 0:8000
          exit 0
      else
          exit 1
      fi
      

      它的作用是在执行时设置UNIQUE_KEY 环境变量,并在停止时立即取消设置。 此外,它也适用于 crontab 这是因为通过 crontab 执行的 shell 脚本在 non-interactive non-login shell session 中运行。

      深入了解不同的 shell 会话可能会有所帮助。

      登录、非登录、交互式非交互式Shell会话之间的区别

      bash shell 根据会话的启动方式读取不同的配置文件。

      不同会话之间的一个区别是外壳是作为“登录”还是“非登录”会话生成的。

      登录 shell 是一个以验证用户身份开始的 shell 会话。如果您正在登录终端会话或通过 SSH 进行身份验证,您的 shell 会话将设置为 "login" shell。

      如果您从经过身份验证的会话中启动新的 shell 会话,就像我们通过从终端调用 bash 命令所做的那样,则会启动 非登录 shell 会话。启动子 shell 时,系统不会要求您提供身份验证详细信息。

      另一个可以区分的地方是shell会话是交互式的还是非交互式的

      交互式 shell 会话是附加到终端的 shell 会话。 非交互式 shell 会话是不附加到终端会话的。

      Check this link for details - Digital Ocean Tutorials

      【讨论】:

        猜你喜欢
        • 2012-11-23
        • 2013-04-04
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 1970-01-01
        • 2021-07-04
        • 2018-08-21
        • 1970-01-01
        相关资源
        最近更新 更多