当Django只启动一次时执行代码?

2024-03-28 20:55:59 发布

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

我正在编写一个Django中间件类,我希望在启动时只执行一次,以初始化其他任意代码。我遵循了sdolanhere发布的非常好的解决方案,但是“Hello”消息被输出到终端两次。E、 g

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”要打印两次吗?谢谢。


Tags: 中间件djangofromimporthttp终端helloworld
3条回答

这个问题在博客文章Entry point hook for Django projects中得到了很好的回答,这将对Django>;=1.4起作用。

基本上,您可以使用<project>/wsgi.py来实现这一点,并且它只在服务器启动时运行一次,但在运行命令或导入特定模块时不会运行。

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

# Run startup code!
....

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

从下面Pykler的答案更新:Django 1.7现在有一个hook for this


别这样做。

你不想把“中间件”作为一次性启动的东西。

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

urls.py

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

urlpatterns = ...

one_time_startup()

更新:Django 1.7现在有一个hook for this

文件:myapp/apps.py

from django.apps import AppConfig
class MyAppConfig(AppConfig):
    name = 'myapp'
    verbose_name = "My Application"
    def ready(self):
        pass # startup code here

文件:myapp/__init__.py

default_app_config = 'myapp.apps.MyAppConfig'

对于Django<;1.7

第一个答案似乎不起作用了,url.py是根据第一个请求加载的。

最近的工作是将启动代码放入任何已安装的应用程序中

def startup():
    pass # load a big thing

startup()

当使用./manage.py runserver时。。。这会执行两次,但这是因为runserver有一些技巧可以先验证模型,等等。。。正常部署或甚至在runserver自动重新加载时,此操作只执行一次。

相关问题 更多 >