Python 启动时自动运行django管理迁移
我试图使Django应用程序的安装过程更简单。其中一个步骤是运行Python 启动时自动运行django管理迁移,python,django,Python,Django,我试图使Django应用程序的安装过程更简单。其中一个步骤是运行django-admin.py migrate,当应用程序使用Gunicorn、uWSGI或mod_wsgi启动时,是否可以自动运行该步骤 编辑:澄清我对创业的看法 edit2:这是一个我共同维护的开源应用程序。我不部署它。它是由经常不了解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翻译文件)
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是用于生产的。