【问题标题】:Django : Call a method only once when the django starts upDjango:在 Django 启动时只调用一次方法
【发布时间】:2013-01-09 02:49:27
【问题描述】:

我想在 Django 启动时初始化一些变量(来自数据库)。

我能够从数据库中获取数据,但问题是我应该如何调用初始化方法。这应该只调用一次。

尝试查看其他页面,但找不到答案。

代码目前看起来像这样 ::


def get_latest_dbx(request, ....):

#从数据库中获取数据


def get_latest_x(请求):

get_latest_dbx(request,x,...)


def 启动(请求):

get_latest_x(请求)

【问题讨论】:

标签: python django django-views django-database


【解决方案1】:

有些人建议(Execute code when Django starts ONCE only?)在顶级 urls.py 中调用该初始化(这看起来不寻常,因为 urls.py 应该处理 url 模式)。通过编写中间件还有另一种解决方法:Where to put Django startup code? 但我相信大多数人都在等待ticket的解决。

更新:

由于OP更新了问题,似乎中间件方式可能更好,因为他实际上需要一个request在启动时的对象。所有启动代码都可以放在自定义中间件的process_request 方法中,其中request 对象在第一个参数中可用。在这些启动代码执行后,可能会设置一些标志以避免稍后重新运行它们(引发MiddlewareNotUsed 异常仅适用于__init__,它不接收request 参数)。

顺便说一句,OP 的要求看起来有点奇怪。一方面,他需要在Django启动时初始化一些变量,另一方面,他需要request对象在初始化。但是当 Django 启动时,可能根本没有传入请求。就算有,也没多大意义。我猜他真正需要的可能是为每个会话或用户做一些初始化。

【讨论】:

  • 我尝试从顶级 urls.py 调用它。但是该函数需要请求对象。我如何在 urls.py 中得到它??
  • 实际上从数据库中获取条目列表并显示它们(自定义编写)的方法需要request.session,所以我需要传递请求对象。 Request 对象(来自 process_request)是否会分配会话变量?
  • 只要启用了SessionMiddleware,你肯定可以从请求的属性中获取会话,即request.session
  • 我无法获取请求对象。会话中间件已启用。
  • 您是否将 'django.contrib.sessions' 放入 INSTALLED_APPS 并将 django.contrib.sessions.middleware.SessionMiddleware 放入 MIDDLEWARE_CLASSES 中?
【解决方案2】:

这有一些作弊。一般的解决方案是尝试在一些特殊的地方包含初始代码,这样当服务器启动时,它会运行这些文件并运行代码。

你有没有试过把 print 'haha' 放在 settings.py 文件中:)?

注意:请注意,settings.py 在启动过程中会运行两次

【讨论】:

  • 运行两次不是问题,但在启动时我需要调用一个需要“请求”对象的函数。这可能吗?
猜你喜欢
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 2012-04-25
  • 1970-01-01
相关资源
最近更新 更多