我正在尝试简化Django应用程序的安装过程。步骤之一是运行django-admin.py migrate
,当使用Gunicorn,uWSGI或mod_wsgi启动应用程序时,有什么方法可以自动运行它。
编辑:弄清启动时的意思。
edit2:这是我共同维护的一个开源应用程序。我没有部署它。它是由通常对Django一无所知的常规系统管理员部署的。一个抱怨是该应用程序难以部署,因为需要执行所有这些手动管理步骤。要求他们在其部署工具中创建一些脚本不会使安装更加容易。我想要的是,然后启动应用程序时,它会检查是否有数据库,如果没有,则运行manage.py migrate
。
edit3:部署通常通过pip
答案 0 :(得分:0)
这取决于您使用的流程管理器,如果您是手动启动它或通过脚本启动它,只需在运行之前运行manage.py migration,我就可以使用超级用户并像这样将它添加为程序
[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
任何进程管理器都可以执行此操作,只需确保将其设置为在迁移完成后该命令消失就不会重新启动。
答案 1 :(得分:0)
这通常会进入部署脚本中,具体取决于您在目标环境中更新Django应用程序的例程。
您不仅需要运行迁移,还可能需要执行一系列通话:
要在设置中获得最大的灵活性,您可以创建一个名为{.3}的setup.py来完成所有操作。如果您需要初始化数据,这也可以加载数据库夹具。
这是我在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钩子或类似的钩子,该钩子运行bash脚本,以调用所需的任何manage.py命令。
如果您是通过 Docker 进行部署的,则可以将对./manage.py setup
的调用放入docker-entrypoint.sh脚本中,该脚本在运行Docker映像时就会被调用。