Django启动代码放在哪里?

2024-04-25 05:23:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

将其放入settings.py中不起作用,因为它要求已加载设置。

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

将它们放在中间件中可以工作,但是每次访问我的应用程序时都会调用它们。一个可能的解决方案可能是创建一个中间件来完成所有的工作,然后将其自身从MIDDLEWARE_CLASSES中移除,这样就不再调用它了。我能不需要太多的猴子修补吗?


Tags: 中间件django代码fromcoreimport服务器视图
3条回答

如果同时使用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()

可以创建自定义命令并在handle函数中编写代码。这里有详细信息https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

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

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

有人说要添加一个启动信号,但这不会很快实现(一个主要的问题是什么时候应该发送这个信号)

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

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

相关问题 更多 >