我正在编写一个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因此不再调用它.如果没有太多的猴子补丁,我可以这样做吗?
我希望我的 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 上执行是可以接受的)?