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的一个想法)来调用它来调用它应该适用于其他环境。 吕克