Python 启动时自动运行django管理迁移

Python 启动时自动运行django管理迁移,python,django,Python,Django,我试图使Django应用程序的安装过程更简单。其中一个步骤是运行django-admin.py migrate,当应用程序使用Gunicorn、uWSGI或mod_wsgi启动时,是否可以自动运行该步骤 编辑:澄清我对创业的看法 edit2:这是一个我共同维护的开源应用程序。我不部署它。它是由经常不了解Django的常规系统管理员部署的。一个抱怨是应用程序很难部署,因为需要所有这些手动管理步骤。要求他们在部署工具中创建一些脚本并不会使安装更容易。我想要的是,当应用程序启动时,它会检查是否有数据库

我试图使Django应用程序的安装过程更简单。其中一个步骤是运行
django-admin.py migrate
,当应用程序使用Gunicorn、uWSGI或mod_wsgi启动时,是否可以自动运行该步骤

编辑:澄清我对创业的看法

edit2:这是一个我共同维护的开源应用程序。我不部署它。它是由经常不了解Django的常规系统管理员部署的。一个抱怨是应用程序很难部署,因为需要所有这些手动管理步骤。要求他们在部署工具中创建一些脚本并不会使安装更容易。我想要的是,当应用程序启动时,它会检查是否有数据库,如果没有,则运行
manage.py migrate


edit3:部署通常是通过
pip

进行的,这取决于您使用的process manager,如果您手动启动它或通过脚本启动它,请在它之前运行manage.py migrate,我使用supervisor并将其作为程序添加到类似的程序中

[program:migrate]
command = python manage.py migrate
autorestart = false
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

任何process manager都可以做到这一点,只要确保您将其设置为在迁移完成后命令停止时不重新启动即可。

这通常会进入部署脚本,具体取决于您在目标环境中更新Django应用程序的例程

您不仅需要运行migrate,还可能需要一个调用列表:

  • 迁移
  • collectstatic(您通常会将它们放在一个目录中,然后由您的代理(例如nginx)直接提供服务,因为Django与这些目录相比速度相当慢)
  • 编译消息(生成*.mo翻译文件)
为了使设置具有最大的灵活性,您可以创建一个名为setup.py的文件来完成所有这些工作。如果需要初始化数据,也可以加载DB装置

下面是我在setup.py中所做工作的一个片段:

def handle(self, *args, **options):
    LOGGER.info('Setup: translations ...')
    call_command('compilemessages', locale=['de'], verbosity=2)
    LOGGER.info('Setup: translations ... DONE')

    LOGGER.info('Setup: DB check and fixtures ...')

    db_error = self.load_db(options)
    if db_error:
        if options['wait_db']:
            while db_error:
                LOGGER.warning('%s - retrying in 5 secs...', db_error)
                time.sleep(5)
                db_error = self.load_db(options)
        else:
            LOGGER.error(db_error)
    LOGGER.info('Setup: DB check and fixtures ... %s', 'FAILED' if db_error else 'OK')

    LOGGER.info('Setup: collectstatic to %s ...', settings.STATIC_ROOT)
    cs_error = None
    try:
        call_command('collectstatic', '--clear', '--noinput')
    except FileNotFoundError as fnfe:
        cs_error = fnfe
        LOGGER.warning('Error during "collectstatic": %s', fnfe)
    LOGGER.info('Setup: collectstatic ... %s', 'WARN' if cs_error else 'OK')

def load_db(self, options):
    try:
        call_command('migrate')
        if not User.objects.count():
            call_command('loaddata', 'auth.json')
            LOGGER.info('Setup: loaded fixture auth.json')
    except DatabaseError as dbe:
        return dbe
如果您通过GIT部署,您可以使用GIT post_merge hook或类似工具来运行bash脚本,调用所需的任何manage.py命令


如果您是通过Docker部署的,您可以将对
/manage.py setup
的调用放入Docker-entrypoint.sh脚本中,该脚本在Docker映像运行时被调用。

启动是什么意思,
python manage.py runserver
?使用makefile。启动时我指的是应用程序启动时。无论是Gunicorn、uWSGI还是mod_wsgi。我不认为runserver是用于生产的。