Django:仅在启动时调用一次方法

6 投票
2 回答
9099 浏览
提问于 2025-04-17 13:37

我想在Django启动的时候初始化一些变量(从数据库中获取)。

我能从数据库里拿到数据,但问题是我该怎么调用这个初始化的方法。而且这个方法只需要调用一次。

我试着在其他页面找答案,但没找到。

现在的代码大概是这样的:


def get_latest_dbx(request, ....):

# 从数据库获取数据


def get_latest_x(request):

get_latest_dbx(request, x, ...)


def startup(request):

get_latest_x(request)

2 个回答

1

这里有一些小窍门。一般来说,解决办法是把初始代码放在一些特殊的位置,这样当服务器启动时,它会运行那些文件,也会执行代码。

你有没有试过在settings.py文件里放一行print 'haha'呢? :)

注意:要知道settings.py在启动时会运行两次。

6

有些人建议在顶层的 urls.py 文件中进行初始化(虽然这样做看起来有点不寻常,因为 urls.py 本来是用来处理网址模式的)。还有一种解决办法是写一个中间件:在哪里放 Django 启动代码? 但我相信大多数人还是在等这个问题的解决。

更新:

因为提问者更新了问题,看起来使用中间件的方法可能更好,因为他实际上在启动时需要一个 request 对象。所有的启动代码可以放在自定义中间件的 process_request 方法中,这里第一个参数就是 request 对象。在这些启动代码执行完后,可以设置一个标志,以避免后续再次执行它们(抛出 MiddlewareNotUsed 异常只在 __init__ 中有效,而 __init__ 不会接收 request 参数)。

顺便说一下,提问者的需求看起来有点奇怪。一方面,他需要在 Django 启动时初始化一些变量,另一方面,他又需要在初始化时有 request 对象。但在 Django 启动时,可能根本没有任何请求进来。即使有请求,这也没什么意义。我猜他真正需要的可能是为每个会话或用户做一些初始化。

撰写回答