我正在编写一个 Django 中间件类,我只想在启动时执行一次,以初始化一些其他任意代码。我遵循了 sdolan 发布的非常好的解决方案here https://stackoverflow.com/questions/3495964/in-django-how-do-i-call-the-subcommand-syncdb-from-the-initialization-script,但是“Hello”消息输出到终端twice. 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
list.
但是当我使用 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”被打印两次吗?谢谢。
更新:Django 1.7 现在有挂钩这个 https://docs.djangoproject.com/en/stable/ref/applications/#django.apps.AppConfig.ready
file: myapp/apps.py
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'myapp'
verbose_name = "My Application"
def ready(self):
pass # startup code here
file: myapp/__init__.py
default_app_config = 'myapp.apps.MyAppConfig'
对于 Django
第一个答案似乎不再起作用,urls.py 在第一次请求时加载。
最近有效的方法是将启动代码放入您的任何一个 INSTALLED_APPS 中init.py 例如myapp/__init__.py
def startup():
pass # load a big thing
startup()
使用时./manage.py runserver
...这会执行两次,但这是因为 runserver 有一些技巧来首先验证模型等...正常部署,甚至当 runserver 自动重新加载时,这只会执行一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)