Django:仅在启动时调用一次方法
我想在Django启动的时候初始化一些变量(从数据库中获取)。
我能从数据库里拿到数据,但问题是我该怎么调用这个初始化的方法。而且这个方法只需要调用一次。
我试着在其他页面找答案,但没找到。
现在的代码大概是这样的:
def get_latest_dbx(request, ....):
# 从数据库获取数据
def get_latest_x(request):
get_latest_dbx(request, x, ...)
def startup(request):
get_latest_x(request)
2 个回答
这里有一些小窍门。一般来说,解决办法是把初始代码放在一些特殊的位置,这样当服务器启动时,它会运行那些文件,也会执行代码。
你有没有试过在settings.py文件里放一行print 'haha'
呢? :)
注意:要知道settings.py在启动时会运行两次。
有些人建议在顶层的 urls.py 文件中进行初始化(虽然这样做看起来有点不寻常,因为 urls.py 本来是用来处理网址模式的)。还有一种解决办法是写一个中间件:在哪里放 Django 启动代码? 但我相信大多数人还是在等这个问题的解决。
更新:
因为提问者更新了问题,看起来使用中间件的方法可能更好,因为他实际上在启动时需要一个 request
对象。所有的启动代码可以放在自定义中间件的 process_request
方法中,这里第一个参数就是 request
对象。在这些启动代码执行完后,可以设置一个标志,以避免后续再次执行它们(抛出 MiddlewareNotUsed
异常只在 __init__
中有效,而 __init__
不会接收 request
参数)。
顺便说一下,提问者的需求看起来有点奇怪。一方面,他需要在 Django 启动时初始化一些变量,另一方面,他又需要在初始化时有 request
对象。但在 Django 启动时,可能根本没有任何请求进来。即使有请求,这也没什么意义。我猜他真正需要的可能是为每个会话或用户做一些初始化。