54

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

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

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

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

将它们放在中间件中会起作用,但是每次访问我的应用程序时都会调用它。一个可能的解决方案可能是创建一个中间件来完成所有工作,然后将其自身从中删除,MIDDLEWARE_CLASSES因此不再调用它。我可以在没有太多猴子修补的情况下做到这一点吗?

4

6 回答 6

59

编写执行此操作的中间件,__init__然后django.core.exceptions.MiddlewareNotUsed__init__, django 将为所有请求删除它:)。__init__顺便说一句,在启动时调用,而不是在第一个请求时调用,因此它不会阻止您的第一个用户。

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

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

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

于 2010-05-06T13:30:51.140 回答
5

在 Django 1.7+ 中,如果您想运行启动代码,并且,

1. 避免在 migrate、makemigrations、shell 会话中运行它...

2.避免运行两次或更多次

一个解决方案是:

文件:myapp/apps.py

from django.apps import AppConfig

def startup():
    # startup code goes here

class MyAppConfig(AppConfig):
    name = 'myapp'
    verbose_name = "My Application"
    def ready(self):
        import os
        if os.environ.get('RUN_MAIN'):
            startup()

文件:myapp/__init__.py

default_app_config = 'myapp.apps.MyAppConfig'

这篇文章使用了来自@Pykler 和@bdoering 的建议

于 2018-11-21T16:01:20.107 回答
4

如果您同时使用 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()
于 2010-05-08T12:38:59.453 回答
3

您可以创建自定义命令并在句柄函数中编写代码。此处的详细信息https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

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

于 2011-08-28T10:55:29.047 回答
1

如果你使用 mod_wsgi,你可以把它放在 wsgi start 应用程序中

于 2010-05-07T15:01:00.147 回答
0

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

于 2013-12-26T16:10:13.517 回答