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

发布于 2021-02-02 23:14:12

我正在编写一个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”?谢谢。

关注者
0
被浏览
85
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    文件: 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

    第一个答案似乎不再起作用,在首次请求时加载urls.py

    最近起作用的是将启动代码放入你的INSTALLED_APPS 初始化 .py 中的任何一个中,例如myapp/__init__.py

    def startup():
        pass # load a big thing
    
    startup()
    

    使用./manage.py runserver...时,它将执行两次,但这是因为runserver具有一些技巧,可以首先验证模型等…常规部署,甚至在runserver自动重新加载时,也仅执行一次。



  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    从以下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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看