我正在编写一个Django Middleware类,我想在启动时只执行一次,以初始化其他一些arbritary代码.我已经按照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')
Run Code Online (Sandbox Code Playgroud)
在我的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
Run Code Online (Sandbox Code Playgroud)
任何有关"Hello world"打印两次的想法?谢谢.
我想在服务器启动(开发和生产)上执行这些代码行:
from django.core import management
management.call_command('syncdb', interactive=False)
Run Code Online (Sandbox Code Playgroud)
放入settings.py它不起作用,因为它需要已经加载设置.
将它们放在视图中并从外部访问该视图也不起作用,因为有些中间件使用数据库而这些中间件将失败并且不允许我访问视图.
将它们放在中间件中会起作用,但每次访问我的应用程序时都会调用它.一个可能的解决方案可能是创建一个中间件来完成所有工作,然后将其自身移除,MIDDLEWARE_CLASSES因此不再调用它.如果没有太多的猴子补丁,我可以这样做吗?
我需要一个地方来运行特定于应用程序的初始化代码(比如连接到信号).当我将代码放到__init__.py应用程序的模块时,我最终得到了模型的循环导入.
有没有办法在框架设置和执行任何请求之前触发函数?
我使用相当旧版本的django 96.6,但我也对当前版本的解决方案感兴趣.
关于其他问题的重复: 以下是问题与S.Lott在评论中建议的重复内容的不同之处:
在django中放置额外启动代码的正确位置? 当函数运行时,Django需要完全初始化.所以manage.py中的代码不起作用.
我应该在Django框架中放置一次性操作操作? 该函数初始化我的应用程序之间的连接.因此必须在每个实际处理请求的线程中运行代码.
对当前解决方案的评论: 我无法使用网址,因为我的大多数应用都没有公开任何网址.他们只是收听信号并在数据库中存储其他信息.
我希望我的 Django 应用程序中的一些代码在服务器启动时只执行一次,而不是每个请求。
具体来说,我想将一些数据库表加载到内存中。这些表包含一些不会随请求更改的“元数据”。像这样:
ProductTypesData = None;
def loadProductTypesData():
productTypes = ProductType.objects.all();
for ptype in productTypes:
ptype_data = {
"id":ptype.id,
"name": ptype.name,
"description":ptype.desc
};
ProductTypesData.append(ptype_data);
loadProductTypesData();
Run Code Online (Sandbox Code Playgroud)
我应该把这段代码放在哪里?其他关于django初始化的Q/A建议放在urls.py中。但是在 urls.py 中导入模型对我来说似乎不合逻辑。
我可以将代码放在models.py中吗?它是否只执行一次(如果在 django start 上执行是可以接受的)?