Django启动代码在哪里?

我想在服务器启动(包括开发和生产)上执行这些代码行:

from django.core import management management.call_command('syncdb', interactive=False) 

把它放在settings.py中不起作用,因为它需要已经加载的设置。

将它们放在视图中并从外部访问该视图也不起作用,因为有一些使用数据库的中间件,这些中间件会失败,不让我访问视图。

把它们放在一个中间件可以工作,但每次访问我的应用程序时都会调用它。 一个可能的解决scheme可能是创build一个完成所有工作的中间件,然后从MIDDLEWARE_CLASSES删除它,这样就不会再调用它了。 我能做到这一点,没有太多的猴子补丁?

编写在__init__中执行此操作的中间件,然后从__init__提取django.core.exceptions.MiddlewareNotUsed ,django将删除它的所有请求:)。 在启动时调用__init__ ,而不是在第一个请求,所以它不会阻止你的第一个用户。

有关于添加启动信号的讨论,但不会很快提供(例如,一个主要问题是何时应发送此信号)

相关票证: https : //code.djangoproject.com/ticket/13024

更新: Django 1.7包含对此的支持。 ( 文档 ,由票据链接)

如果您同时使用Apache / mod_wsgi,请使用以下所述的WSGI脚本文件:

http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

在激活语言翻译后添加所需内容。

从而:

 import sys sys.path.insert(0, '/usr/local/django/mysite') import settings import django.core.management django.core.management.setup_environ(settings) utility = django.core.management.ManagementUtility() command = utility.fetch_command('runserver') command.validate() import django.conf import django.utils django.utils.translation.activate(django.conf.settings.LANGUAGE_CODE) # Your line here. django.core.management.call_command('syncdb', interactive=False) import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler() 

您可以创build一个自定义命令,并在句柄函数中编写代码。 详细信息在这里https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

然后,您可以创build一个运行django服务器的启动脚本,然后执行新的自定义命令。

如果你正在使用mod_wsgi,你可以把它放在wsgi开始的应用程序

下面是我如何解决Django丢失的启动信号: https : //github.com/lsaffre/djangosite/blob/master/djangosite/models.py在那里调用的代码是特定于我的djangosite项目,但是通过编写一个特殊的应用程序(基于Ross McFarland的一个想法)来调用它来调用它应该适用于其他环境。 吕克