仅在Django启动一次时执行代码?


176

我正在编写一个Django中间件类,该类只想在启动时执行一次,以初始化一些其他人工代码。我遵循了sdolan 在此处发布的非常好的解决方案,但是“ Hello”消息两次输出到终端。例如

from django.core.exceptions import MiddlewareNotUsed
from django.conf import settings

class StartupMiddleware(object):
    def __init__(self):
        print "Hello world"
        raise MiddlewareNotUsed('Startup complete')

在我的Django设置文件中,该类已包含在MIDDLEWARE_CLASSES列表中。

但是当我使用runserver运行Django并请求页面时,我进入了终端

Django version 1.3, using settings 'config.server'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Hello world
[22/Jul/2011 15:54:36] "GET / HTTP/1.1" 200 698
Hello world
[22/Jul/2011 15:54:36] "GET /static/css/base.css HTTP/1.1" 200 0

有什么想法为什么要打印两次“ Hello world”?谢谢。


1
只是出于好奇,您是否知道为什么init .py中的代码会执行两次?
突变2012年

3
@Mutant它仅在runserver下执行两次...这是因为runserver首先加载应用程序以检查它们,然后实际启动服务器。即使在自动重载运行服务器时,该代码也只能执行一次。
皮克勒

1
哇,我来过这里。...所以再次感谢您对@Pykler的评论,这就是我想知道的。
WesternGun

Answers:


111

从以下Pykler的答案进行更新:Django 1.7现在对此具有钩子


不要这样

您不希望一次性使用“中间件”。

您想在顶层执行代码urls.py。该模块将被导入并执行一次。

urls.py

from django.confs.urls.defaults import *
from my_app import one_time_startup

urlpatterns = ...

one_time_startup()

1
@Andrei:管理命令完全是一个单独的问题。在所有管理命令之前进行特殊的一次性启动的想法很难理解。您必须提供特定的内容。也许是另一个问题。
S.Lott

1
尝试在urls.py中打印简单文本,但是绝对没有输出。怎么了 ?
史蒂夫·K

8
仅在第一次请求时执行urls.py代码(猜测它回答了@SteveK的问题)(Django 1.5)
lajarre

4
这对于每个工人执行一次,在我的情况下,总共执行了3次。
拉斐尔2014年

9
@halilpazarlama这个答案已经过时了-您应该使用Pykler的答案。
Mark Chackerian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.